Получить module.exports из одного файла - PullRequest
9 голосов
/ 30 ноября 2010

В файле у меня есть этот код:

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

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

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

this.greet()

Но это не так.

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

Ответы [ 2 ]

11 голосов
/ 30 ноября 2010

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

Сначала какой-то фон
Что происходит, так это то, что 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; и удалите его.

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

0 голосов
/ 23 августа 2018

У меня была такая же проблема!То, как вы ссылаетесь на переменную в других файлах, похоже на то, как вы должны ссылаться на нее здесь.

попробуйте

 modules.exports.foo ...

в файле для доступа к этой переменной.

exports.foo ...

также должно работать!

...