NodeJS 的多个 module.exports

Posted

技术标签:

【中文标题】NodeJS 的多个 module.exports【英文标题】:Multiple module.exports for NodeJS 【发布时间】:2019-01-02 09:05:57 【问题描述】:

我试图在我的 NodeJS 模块中添加两个 module.exports。我为我的模块尝试了以下代码:

exports.one = function(data)
    const one = data;
;
module.exports = function(msg) 
    console.log(one+'::'+msg);
;

下面是 index.js 的代码:

var myModule = require('./mymodule.js');


myModule.one('hi');
myModule('bro');
myModule('Dear');
myModule('Dude');

我预计它会将以下数据记录到控制台中:

hi bro
hi Dear
hi Dude

但是控制台说:

TypeError: myModule.one is not a function
    at Object.<anonymous> (....

请问我该如何解决这个问题?有 Stack Overflow 问题询问如何在 NodeJS 模块中使用多个 module.exports。但答案如下:

exports.one = function ();
exports.two = function ();

但如果我使用该代码,我必须使用

myModule.one('hi');
myModule.two('bro');
myModule.two('Dear');
myModule.two('Dude');

代替:

myModule.one('hi');
myModule('bro');
myModule('Dear');
myModule('Dude');

【问题讨论】:

【参考方案1】:

你似乎在寻找

let one = '';
module.exports = function(msg) 
    console.log(data+'::'+msg);
;
module.exports.one = function(data)
    one = data;
;

注意exports 变量只是module.exports 对象的别名,当用你的函数覆盖它时,你丢弃了它的内容。您需要将 one 方法放在您的 main 函数中。

【讨论】:

好主意!但是有一个小问题。我说过,在运行myModule('bro'); 时使用保存在myModule.one('hi'); 的配置,其中myModule('bro'); 是在模块中首先定义的。 注意 const one = data 的行。我打算在实际上位于 module.exports.one 函数上方的 module.exports 函数中使用它。 当我尝试 module.exports = function(msg) console.log(one+'::'+msg); ; module.exports.one = function(data) const one = data; ; 时,控制台会显示一条错误日志,提示 ReferenceError: one is not defined @NodeDev 何时定义函数并不重要,重要的是何时调用它们。只要在定义了所有它们之后才调用它们,那么从另一个调用它们是没有问题的。 @NodeDev 当然它没有被定义——const one 是一个 local 变量。如果你想从两个函数中访问它,你可能想把它放在模块级别的范围内,尽管你需要使用let 而不是const【参考方案2】:

当您执行以下操作时:

module.exports.one = function(data)
    const one = data;
;
module.exports = function(msg) 
    console.log(data+'::'+msg);
;

您首先将属性 one 分配给模块对象 (exports.one=...)。然后你用第二行重新评估整个 module.exports 对象,从而删除你分配给它的第一个函数。

你可以这样解决:

module.exports.one = function(data)
    const one = data;
;
module.exports.two = function(msg) 
    console.log(data+'::'+msg);
;

然后您可以像这样调用其他模块中的函数:

var myModule = require('./mymodule.js');
myModule.one(arg1) // calls first function
myModule.two(arg2) // calls second function

【讨论】:

是的,但第一个功能是为应用程序/模块分配一些配置。然后使用 myModule('bro'); myModule('亲爱的'); myModule('老兄');我想运行 main 函数,这取决于 myModule.one(config); 分配的配置;

以上是关于NodeJS 的多个 module.exports的主要内容,如果未能解决你的问题,请参考以下文章

nodeJS exports – exports vs module.exports

NodeJS / Express 中的“module.exports”和“exports.methods”是啥意思?

nodejs中exports与module.exports的区别

nodejs中exports与module.exports的区别

NodeJS中模块成员导出的另一种方式![module.exports]

Nodejs/Express/Typescript 需要 module.exports