如何将配置传递给节点模块?

时间:2018-01-10 17:02:14

标签: javascript node.js

我的模块mymodule有一些配置foobar和两个函数f1f2

我想在其中一个客户端中使用默认值初始化此模块,并在另一个客户端中传递其他一些默认值。

这样的事情:

// mymodule.js 
let conf = {}

function f1(opts = {}) {
    let a = conf.foo
    let b = opts.baz
    // do something with a and b
}
function1 f2(opts = {}) {
    let c = conf.bar
    let d = opts.qux
    // something with c and d

}

modul.exports = function(defaults = {foo:'foo', bar:'bar'}) {
    conf = defaults
    return {
        f1,
        f2
    }
}

// client1.js
const mymodule = require('./mymodule')();
...
mymodule.f1();
mymodule.f2();

// client2.js
const mymodule = require('./mymodule')({
    foo:'leFoo',
    bar:'leBar'
});
...
mymodule.f1();
mymodule.f2();

问题当然是,如果我这样做,当我使用client2时,我会覆盖来自client1的conf。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

有很多方法可以达到这个目的,但是最接近你已经得到的方法是将整个模块包装在一个函数中:

modul.exports = function(defaults = {foo:'foo', bar:'bar'}) {
    let conf = defaults

    function f1(opts = {}) {
        let a = conf.foo
        let b = opts.baz
        // do something with a and b
    }

    function1 f2(opts = {}) {
        let c = conf.bar
        let d = opts.qux
        // something with c and d
    }

    return {
        f1,
        f2
    }
}

现在每个调用者都有一个私有配置的模块版本。