[英]Sharing & modifying a variable between multiple files node.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;
var count = require('./main.js').count;
console.log(count);
var count = require('./main.js').count;
count += 10;
console.log(count);
var count = require('./main.js').count;
count -= 10;
console.log(count);
1
11
-9
我有一个应用程序(irc bot),我想添加一个功能,peeps 可以执行 @add 1 或 @remove 1。我有一个 main.js,然后根据所说的触发器需要不同的文件。 所以 add 将触发 add.js 文件,然后将 require('main.js') 并添加 10(为简化为 10,它实际上会解析数字并使用该数字)。 我遇到的问题是当有人走动并执行@remove 时。 它 require('main.js') 并从 1 中减去 10 结果为 -9。 并且执行@total 将输出 1。
我已经对 module.exports 进行了相当好的搜索,但我没有遇到过像我上面列出的那样的例子。 文档不包含任何与我想要做的事情接近的示例; 这些问题1 、 2我理解——但对我没有任何用处——因为我理解那里所说的。
我想让 @add 和 @remove 操作同一个变量( count ),并且 @total 返回总计数并考虑 @add 和 @removes 。 我是否错误地使用了 module.exports; 或者是否有一种共享变量的通用方式,一个文件能够修改 module.exports 的内容并将结果返回到 main.js 文件?
你的问题是,当你做var count = require('./main.js').count;
,您将获得该编号的副本,而不是参考。 改变count
不会改变“来源”。
但是,您应该具有文件导出功能。 请求一个文件只会在第一次运行它,但之后它会被缓存并且不会重新运行。 查看文档
建议#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:我个人会创建一个计数器模块(这是一个单一的实例,但你可以很容易地把它变成一个“类”):
// 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;
}
}
不确定这是否是新的,但您确实可以在文件之间共享变量,例如:
主文件
exports.main = {
facebook: null
};
计数器.js
var jamie = require('./main');
console.info(jamie); //{facebook: null}
jamie.main.facebook = false;
console.info(jamie); //{facebook: false}
另一个检查.js
var jamie = require('./main');
console.info(jamie); //{facebook: null} //values aren't updated when importing from the same file.
jamie.main.facebook = true;
console.info(jamie); //{facebook: true}
现在您可以在文件之间共享。
我和你有同样的问题,.. 有时我想在多个文件之间共享变量,因为我喜欢模块化风格,例如。 在 node.js 脚本的不同文件夹/文件中分离控制器、函数、模型,以便我可以轻松管理代码。
我不知道这是否是最好的解决方案,但我希望能满足您的需求。
模型/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}]
我知道我回答这个问题有点晚了,只有 7 年!
您可以简单地使用全局变量:
global.myVar = 'my-val';
console.log(myVar); // returns 'my-val'
// from here on it's accessable to all modules by just the variable name
您无法在不同文件之间共享参考。 你不应该。
我有一个 main.js 然后根据所说的触发器需要不同的文件
我不认为这是个好主意。 您需要的所有 require 语句都必须位于文件的顶部。
我还看到你需要main.js
在total.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.
一个可行但不推荐的小技巧是使用process
变量。 您可以对它应用不同的属性,并且本质上像使用基于浏览器的 JS 中的window
对象一样使用它们。 这个小技巧将提供对变量的引用。 它可以改变和操纵和改变将结转到全部文件require
d。
但请注意,不建议这样做,因为覆盖
process
变量可能会产生一些意想不到的影响,并且在另一个过程干扰时可能会丢失信息。
文件1.js:
const s1 = require('./file2');
process.num = 2;
console.log("file1", process.num);
s1.changeNum();
console.log("file1", process.num);
file2.js:
module.exports.changeNum = () => {
process.num = 3;
console.log("file2", process.num);
};
输出:
file1 2
file2 3
file1 3
或者,对于所有其他答案
吸气和setter方法
var _variableThing = 1223
module.exports = {
get variableThing(){
return _variableThing
},
set variableThing(val){
_variableThing = val
}
}
虽然不适用于直接导入
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.