从同一文件中获取module.exports

时间:2010-11-30 01:24:24

标签: javascript module node.js commonjs

在文件中我有这段代码:

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

我想在同一个文件中使用该功能。

我认为这样可行:

this.greet()

但事实并非如此。

我必须使用什么参考?

2 个答案:

答案 0 :(得分:11)

通常,这应该可以正常工作,但让我们看看为什么会失败。

首先背景
会发生的事情是exports是一个对象,与requiremodule__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;,然后将其删除。

确保打开一个新终端,因为更改这两个文件只会在创建一个文件时读入。

答案 1 :(得分:0)

我遇到了同样的问题!在其他文件中引用变量的方式与在此处引用变量的方式类似。

尝试

 modules.exports.foo ...
文件中的

以访问该变量。

exports.foo ...

应该也可以!