从同一文件中获取module.exports

13

我有一个文件里面有这段代码:

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

我希望从同一个文件中使用该函数。

我以为这会起作用:

this.greet()

但是它没有。

我需要使用哪个参考文献?


只是想问一下,我关于环境变量的答案是否对您有帮助,否则这可能是一个应该提交的错误 :) - Ivo Wetzel
2个回答

13

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

首先了解一些背景信息
发生的情况是,exports 是一个对象,连同一些其他东西,如 requiremodule__dirname 等等,被传递到包裹模块内容的闭包中。然后通过 require() 返回 exports

参见: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被设置为一个大于零的整数。

在这种情况下,模块将在它们自己的上下文中运行。main模块内部的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

解决方案
你可以检查传递给node进程的环境变量:

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;的内容,并将其删除。

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


7
我遇到了同样的问题!在其他文件中引用变量的方式与在此处引用变量的方式类似。
请尝试:
 modules.exports.foo ...

在文件内访问该变量。

exports.foo ...

应该也可以工作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接