在多个文件node.js之间共享和修改一个variables

main.js

var count = 1; // psuedocode // if (words typed begins with @add) require('./add.js'); // if (words typed begins with @remove) require('./remove.js'); // if (words typed begins with @total) require('./total.js'); module.exports.count = count; 

total.js

 var count = require('./main.js').count; console.log(count); 

add.js

 var count = require('./main.js').count; count += 10; console.log(count); 

remove.js

 var count = require('./main.js').count; count -= 10; console.log(count); 

的console.log

  1 11 -9 

背景:

我有一个应用程序(IRC机器人),我想添加一个function,可以做@add 1或@remove 1.我有一个main.js,然后需要不同的文件,取决于所说的触发器。 所以添加会触发add.js文件,然后需要('main.js')并添加10(简化,它实际上会parsing数字并使用该数字)。 我遇到的问题是,当有人走了,做@remove。 它需要('main.js')并从1中减去10,结果为-9。 做@total将输出1。

我已经做了一个相当不错的searchmodule.exports,我还没有遇到像上面列出的一个例子。 文档不包括任何接近我想要做的例子; 这些问题1,2我明白 – 但对我没有任何用处,因为我明白那里正在说什么。

题:

我想同时使用@add和@remove来操作同一个variables(count),对于@total来说,要考虑到@add和@removes的总数。 我使用module.exports不正确; 还是有共同的variables共享方式,一个文件可以修改模块的内容。导出并返回结果到main.js文件?

你的问题是,当你做var count = require('./main.js').count; ,你会得到这个号码的副本,而不是一个参考。 更改count不会更改“来源”。

但是,您应该有文件导出function。 需要一个文件只会在第一次运行,但之后会被caching,不会重新运行。 看文档

build议#1:

 // main.js var count = 1; var add = require('./add.js'); count = add(count); // add.js module.exports = function add(count) { return count+10; } 

#2:

 var count = 1; var add = function() { count += 10; } add(); 

#3:就个人而言,我会创build一个计数器模块(这是一个单一的实例,但你可以很容易地使它成为一个“类”):

 // main.js var counter = require('./counter.js'); counter.add(); console.log(counter.count); // counter.js var Counter = module.exports = { count: 1, add: function() { Counter.count += 10; }, remove: function() { Counter.count += 10; } } 

不知道这个新的或不是,但你确实可以共享文件之间的variables,如:

main.js

 exports.main = { facebook: null }; 

counter.js

 var jamie = require('./main'); console.info(jamie); //{facebook: null} jamie.main.facebook = false; console.info(jamie); //{facebook: false} 

anothercheck.js

 var jamie = require('./main'); console.info(jamie); //{facebook: false} jamie.main.facebook = true; console.info(jamie); //{facebook: true} 

现在你可以分享文件。

您无法在不同的文件之间共享参考。 你不应该。

我有一个main.js然后需要不同的文件取决于所说的触发器

我不认为这是一个好主意。 所有需要的语句你永远需要必须在文件的顶部。

我也看到你在main.js中需要main.js中的total.jsmain.jsrequire()函数导入文件的module.exports并将其分配给您提供的名称空间。 你的代码不应该以这种方式分割成文件。 只有当它们是模块时,才将代码解压到单独的文件中。 如果你这样做,你不会相互导入2个文件。

在javascript中,当你给一个命名空间分配一些东西时,如果它是一个基元,它会被复制(克隆)。 如果它是一个对象,那么这两个命名空间就会引用同一个对象

 var num = 5; var prim = num; prim++; // prim is 6, but num is still 5. var num = {five:5}; var ob = num; ob.five = 6; console.log(num.five) //also 6. 

我有像你一样的问题,有时候我想分享多个文件之间的variables,因为我喜欢模块化的风格,例如。 分离控制器,function,模型在我的node.js脚本上的不同文件夹/文件,这样我就可以轻松pipe理代码。

我不知道这是否是最好的解决scheme,但我希望能满足您的需求。

车型/ data.js

 // exports empty array module.exports = []; 

控制器/ somecontroller.js

 var myVar = require('../models/data'); myVar.push({name: 'Alex', age: 20}); console.log(myVar); // [{ name: 'Alex', age: 20 }] 

控制器/ anotherController.js

 var myVar = require('../models/data'); console.log(myVar); // This array has value set from somecontroller.js before... // [{ name: 'Alex', age: 20 }] // Put new value to array myVar.push({name: 'John', age: 17}); console.log(myVar); // Value will be added to an array // [{ name: 'Alex', age: 20 }, { name: 'John', age: 17}]