繁体   English   中英

在多个文件 node.js 之间共享和修改变量

[英]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;

总计.js

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

添加.js

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

删除.js

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 进行了相当好的搜索,但我没有遇到过像我上面列出的那样的例子。 文档不包含任何与我想要做的事情接近的示例; 这些问题12我理解——但对我没有任何用处——因为我理解那里所说的。

题:

我想让 @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

在节点 js 中使用全局变量

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

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

我不认为这是个好主意。 您需要的所有 require 语句都必须位于文件的顶部。

我还看到你需要main.jstotal.jstotal.jsmain.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM