共享与修改多个文件的Node.js之间的变量

问题描述 投票:34回答:6

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机器人),我想添加一个功能,偷看可以做@add 1或1 @Remove我有一个main.js那则需要具体取决于该触发器不同的文件。因此,添加将触发add.js文件,然后将要求(“main.js”),并添加10(10为简化起见,它实际上会解析数,并使用该号码)给它。我遇到的问题是,当有人去了解和做@Remove。它要求(“main.js”)和从1导致-9减去10。和做@total将输出1。

我已经做了module.exports一个相当不错的搜索,我还没碰到过像我上面列出的例子。 The docs不包括接近我想要做什么任何的例子;而这些问题12我理解 - 但任何用处我不是 - 我的理解什么正在那里说。

题:

我想有两个@add和@Remove操纵相同的变量(计数),以及@total的总数与考虑到@add和@removes返回。我使用module.exports不正确;或者是有没有变量共享一个共同的方式,用一个文件能够修改module.exports的内容和结果返回到main.js文件?

node.js variables module sharing total.js
6个回答
51
投票

你的问题是,当你做var count = require('./main.js').count;,你得到这个数字,而不是引用的副本。更改count不会更改“源”。

但是,你应该有文件导出功能。需要文件将只运行它的第一次,但之后它的缓存,并且不会重新运行。 see docs

建议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;
    }
}

13
投票

不知道这新的或没有,但你可以将文件本身之间的确共享变量:

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: null} //values aren't updated when importing from the same file.
jamie.main.facebook = true;
console.info(jamie); //{facebook: true}

现在,您可以将文件之间共享。


4
投票

我有一个像你一样的问题,。有时我想多个文件之间共享变量,因为我爱模块化风格如。在我的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}]

1
投票

有没有办法可以分享不同的文件之间的引用。你不应该。

我有一个main.js那则需要视不同的触发器文件被称

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

我也看到你在main.js total.jstotal.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.

0
投票

该工程,但不建议小黑客是使用process变量。您可以将不同的属性给它,基本上使用它们,就像您在基于浏览器的JS的window对象。这个小技巧将提供对变量的引用。它可以改变和操纵和变化将结转到是required的所有文件。

但是千万注意,不推荐,因为重写process变量可能有一些意想不到的效果,并受的信息应另一个进程干扰损失。


file1.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


0
投票

另外,所有其他的答案

吸气和setter方法

var _variableThing = 1223

module.exports = {
  get variableThing(){
    return _variableThing
  },

  set variableThing(val){
    _variableThing = val
  }
}

不会直接进口的工作,虽然

© www.soinside.com 2019 - 2024. All rights reserved.