2010-11-30 6 views
9

В файле у меня есть этот код:Получить module.exports из того же файла

module.exports.greet = function() {...} 

Я хочу использовать эту функцию из того же файла.

Я думал, что это будет работать:

this.greet() 

Но это не так.

Какая ссылка я должен использовать?

+0

Просто хотел спросить, полезен ли мой ответ об окружающей среде varaible, иначе это может быть ошибка, которая должна быть подана :) – 2010-12-03 18:09:52

ответ

11

Обычно это должно работать нормально, но давайте посмотрим, почему это может закончиться неудачей.

Некоторые Фоновая первый
Что происходит, что 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; и убери это.

Убедитесь, что вы открыли новый терминал, поскольку эти два файла считываются только в том случае, если они созданы.

Смежные вопросы