Обычно это должно работать нормально, но давайте посмотрим, почему это может закончиться неудачей.
Некоторые Фоновая первый
Что происходит, что 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;
и убери это.
Убедитесь, что вы открыли новый терминал, поскольку эти два файла считываются только в том случае, если они созданы.
Просто хотел спросить, полезен ли мой ответ об окружающей среде varaible, иначе это может быть ошибка, которая должна быть подана :) – 2010-12-03 18:09:52