在一个文件中,我有以下代码:
module.exports.greet = function() {...}
我想在同一个文件中使用该功能。
我认为这会起作用:
this.greet()
但它没有。
我必须使用什么参考?
在一个文件中,我有以下代码:
module.exports.greet = function() {...}
我想在同一个文件中使用该功能。
我认为这会起作用:
this.greet()
但它没有。
我必须使用什么参考?
通常,这应该可以正常工作,但让我们看看为什么这可能会失败。
一些背景首先
发生的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
对象,而在子模块内部,它将引用沙箱对象。因此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;
内容并将其删除。
确保打开一个新终端,因为只有在创建一个文件时才会读取这两个文件的更改。
我遇到过同样的问题!在其他文件中引用变量的方式与在此处引用变量的方式类似。
尝试
modules.exports.foo ...
在文件中访问该变量。
exports.foo ...
也应该工作!