【问题标题】:Multiple module.exports for NodeJSNodeJS 的多个 module.exports
【发布时间】: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');

【问题讨论】:

    标签: javascript node.js module node-modules


    【解决方案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); 分配的配置;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2020-08-31
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多