Обычно, это должно работать просто отлично, но давайте посмотрим, почему это может не получиться.
Сначала какой-то фон
Что происходит, так это то, что exports
является объектом, который, наряду сс некоторыми другими вещами, такими как require
, module
, __dirname
и т. д., передается в замыкание, которое оборачивает содержимое модулей, exports
затем возвращается require()
.
См .:https://github.com/ry/node/blob/master/src/node.js#L327
this
внутри модуля относится к объекту exports
, тогда объект module
содержит ссылку на объект exports
.Пространство имен внутри модуля предоставляется через замыкание.
В конце есть также объект global
, который предоставляет глобальное пространство имен и содержит такие вещи, как process
.
Примеры
// main.js
this.bla = function(){} // sets bla on the the exports object
require('./sub');
console.log(this); // { bla: [Function] }
console.log(exports); // { bla: [Function] }
console.log(module); /* { id: '.',
exports: { bla: [Function] },
parent: undefined,
filename: '/home/ivo/Desktop/main.js',
loaded: false,
exited: false,
children: [] } */
// sub.js
this.greet = function() {} // sets greet on the exports object
console.log(this); // { greet: [Function] }
console.log(exports); // { greet: [Function] }
console.log(module); /* { id: './sub',
exports: { greet: [Function] },
parent:
{ id: '.',
exports: { bla: [Function] },
parent: undefined,
filename: '/home/ivo/Desktop/main.js',
loaded: false,
exited: false,
children: [] },
filename: '/home/ivo/Desktop/sub.js',
loaded: false,
exited: false,
children: [] } */
Причина проблемы
Единственное объяснение того факта, что ваш код не работает, состоит в том, что установлена переменная окружения NODE_MODULE_CONTEXTS
целое число больше нуля.
В этом случае модули запускаются в своем собственном контексте.this
внутри основного модуля теперь будет ссылаться на объект global
, а внутри подмодулей - на объект sandbox .Поэтому this.foo
не будет устанавливать никаких свойств для объекта exports
.
См .: https://github.com/ry/node/blob/master/src/node.js#L98
И: https://github.com/ry/node/blob/master/src/node.js#L296
Устранение проблемы
Вы можете проверить переменные среды, которые были переданы процессу узла:
console.log(process.env); // get a list of all variables
// get just the one that's causing trouble, if this returns a number > 0 then it's in effect
console.log(process.env['NODE_MODULE_CONTEXTS']);
В случае, если действует NODE_MODULE_CONTEXTS
, вам необходимо проверить файлы ~/.bashrc
и ~/.bash_profile
начто-то вроде export NODE_MODULE_CONTEXTS=1;
и удалите его.
Обязательно откройте новый терминал, поскольку изменения этих двух файлов считываются только при создании одного.