ajs*_*sie 10 javascript module commonjs node.js
在一个文件中我有这个代码:
module.exports.greet = function() {...}
Run Code Online (Sandbox Code Playgroud)
我想在同一个文件中使用该函数.
我认为这会奏效:
this.greet()
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.
我必须使用什么参考?
Ivo*_*zel 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: [] } */
Run Code Online (Sandbox Code Playgroud)
问题
的原因您的代码不起作用的唯一解释是环境变量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']);
Run Code Online (Sandbox Code Playgroud)
如果NODE_MODULE_CONTEXTS有效,您需要检查您的~/.bashrc和~/.bash_profile文件类似的东西export NODE_MODULE_CONTEXTS=1;并将其删除.
确保打开一个新终端,因为更改这两个文件只能在创建一个时读入.
我遇到过同样的问题!在其他文件中引用该变量的方式与在此处引用该变量的方式类似。
尝试
modules.exports.foo ...
Run Code Online (Sandbox Code Playgroud)
在文件中访问该变量。
exports.foo ...
Run Code Online (Sandbox Code Playgroud)
应该也可以!
| 归档时间: |
|
| 查看次数: |
4568 次 |
| 最近记录: |