node.js中的模块如何维护状态?

时间:2014-05-06 18:10:39

标签: javascript node.js

我有两个不同的js文件使用相同的模块。

file1.js:

var mod1 = require('commonmodule.js');
mod1.init('one');

file2.js:

var mod2 = require('commonmodule.js');
mod2.init('two');

(这两个文件file1.js,file2.js都加载到我的server.js文件中,它们本身就是模块)

现在在commonmodule.js:

var savedName;
exports.init = function(name)
{
    savedName = name;
}
exports.getName = function()
{
    return savedName;
}

我注意到这个savedName总是被覆盖,取决于最后设置它的人。所以它似乎不起作用。我如何获得维持状态的模块?

注意:我还尝试将savedName设置为commonmodule.js中的exports.savedName,但它不起作用

4 个答案:

答案 0 :(得分:4)

每次需要模块时,您都可以创建一个新实例:

commonmodule.js

function CommonModule() {
    var savedName;
    return {
        init: function(name) {
            savedName = name;
        },
        getName: function() {
            return savedName;
        }
    };
}

module.exports = CommonModule;

file1.js

var mod1 = new require('./commonmodule')();
mod1.init('one');
console.log(mod1.getName()); // one

file2.js

var mod2 = new require('./commonmodule')()
mod2.init('two');
console.log(mod2.getName()); // two

答案 1 :(得分:2)

模块本身就是简单的对象实例。所有其他模块将共享一个实例(需要注意的是它是通过相同的路径加载的)。如果需要state,请使用类并导出构造函数。

示例:

//Person.js
function Person(name) {
    this.name = name;
}

module.exports = Person;

使用它:

var Person = require("./Person");
var bob = new Person("Bob");

答案 2 :(得分:0)

模块不像类/类函数;默认情况下,由于缓存,mod1mod2将引用同一模块。要跟踪每个实例的状态,您需要一个构造函数或模块内部类似的东西,例如。

var mod = require('commonmodule.js');
var state = new mod.init('one');

init定义有状态对象的位置。你也可以让它返回一个对象文字,在这种情况下你不必使用new(例如var state = require('commonmodule.js').init('one');

(假设您希望模块除了每个实例状态之外还有其他共享状态;如果不是这样,那么Peter Lyons的方法会更简单。)

答案 3 :(得分:-1)

您可以从缓存中删除模块。像那样:

file1.js:

var mod1 = require('commonmodule.js');
mod1.init('one');

file2.js:

delete require.cache[require.resolve(modulename)];

var mod2 = require('commonmodule.js');
mod2.init('two');

但我发现它不是很方便和干净。

但您也可以clone it或制作一个小代理。

你也可以创建类:

var savedName;
exports.obj = {}
exports.obj.prototype.init = function(name)
{
    savedName = name;
}
exports.obj.prototype.getName = function()
{
    return savedName;
}

然后:

var mod2 = new (require('commonmodule.js'))();
mod2.init('two');