在多个文件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.js
和main.js
。 require()
函数导入文件的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}]