分享&修改多个文件node.js之间的变量

时间:2013-06-15 04:14:35

标签: node.js variables module sharing total.js

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 bot),我想添加一个窥视可以执行@add 1或@remove 1的功能。我有一个main.js然后需要不同的文件,具体取决于所说的触发器。因此add会触发add.js文件,然后需要('main.js')并添加10(简化为10,它实际上会解析数字并使用该数字)。我遇到的问题是当有人去做并且做@remove时。它需要('main.js')并从1减去10,结果为-9。做@total会输出1.

我已经对module.exports进行了相当不错的搜索,我没有遇到像上面列出的那个例子。 The docs不包括任何接近我想要做的例子;这些问题12我理解 - 但对我没有任何用处 - 因为我理解在那里说了什么。

问题:

我希望@add和@remove都操纵相同的变量(count),并且@total要求@add和@removes考虑的总计数。我是否正确使用module.exports;或者是否有共享变量的常用方法,一个文件能够修改module.exports的内容并将结果返回到main.js文件?

7 个答案:

答案 0 :(得分:48)

您的问题是当您执行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;
    }
}

答案 1 :(得分:13)

不确定这是否是新的,但你确实可以在文件之间共享变量:

<强> main.js

{{ attribute(xxxx.image[0], '#text') }}

<强> counter.js

exports.main = {
    facebook: null
};

<强> anothercheck.js

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

我知道我回答这个问题有点晚了,只有7岁!

您可以简单地使用全局变量:

ServiceCollection

using-global-variables-in-node-js

答案 4 :(得分:1)

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

  

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

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

我还看到main.js中的total.jstotal.js中的main.js需要require()module.exports函数导入文件的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. 并将其分配给您提供的命名空间。不应以这种方式将代码拆分为文件。只有当它们是模块时,才将代码提取到单独的文件中。如果你这样做,你就不会互相导入2个文件。

值得注意的是,在javascript中,当您为命名空间分配内容时,如果它是原语,则会被复制(克隆)。如果它是一个对象,则两个名称空间都引用同一个对象

{{1}}

答案 5 :(得分:0)

一个可行但不建议使用的小技巧是使用Ispum变量。您可以对其应用不同的属性,并像在基于浏览器的JS中的process对象一样使用它们。这个小技巧将提供对该变量的引用。可以对其进行更改和操作,并且更改将保留到window d的所有文件中。

  

但是请注意,不建议这样做,因为覆盖require变量可能会产生一些意想不到的影响,并且如果其他进程进行干预,则可能会丢失信息。


file1.js:

process

file2.js:

const s1 = require('./file2');
process.num = 2;
console.log("file1", process.num);
s1.changeNum();
console.log("file1", process.num);

输出

  

module.exports.changeNum = () => { process.num = 3; console.log("file2", process.num); };

     

file1 2

     

file2 3

答案 6 :(得分:0)

或者其他所有答案

获取器 设置器

var _variableThing = 1223

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

  set variableThing(val){
    _variableThing = val
  }
}

虽然不能直接导入