【问题标题】:Get module.exports from within the same file从同一文件中获取 module.exports
【发布时间】:2011-05-17 14:54:52
【问题描述】:

在一个文件中我有这个代码:

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

我想在同一个文件中使用该函数。

我认为这会起作用:

this.greet()

但它没有。

我必须使用什么参考?

【问题讨论】:

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

标签: javascript module node.js commonjs


【解决方案1】:

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

先了解一些背景
发生的情况是 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; 之类的内容并将其删除。

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

【讨论】:

    【解决方案2】:

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

    试试

     modules.exports.foo ...
    

    在文件中访问该变量。

    exports.foo ...
    

    应该也可以!

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多