48

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;

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

我已经对 module.exports 进行了相当好的搜索,但我还没有遇到像上面列出的那样的示例。 这些文档不包含任何接近我想要做的例子;这些问题1 , 2我理解——但对我没有任何用处——因为我理解那里所说的内容。

问题:

我想让 @add 和 @remove 都操纵同一个变量( count ),并让 @total 返回考虑到 @add 和 @removes 的总数。我是否错误地使用了 module.exports;还是有一种共享变量的通用方式,一个文件能够修改 module.exports 的内容并将结果返回到 main.js 文件?

4

7 回答 7

62

您的问题是,当您这样做时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;
    }
}
于 2013-06-15T04:26:46.713 回答
14

不确定这是否是新的,但您确实可以在文件之间共享变量,如下所示:

main.js

exports.main = {
    facebook: null
};

计数器.js

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

另一个check.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}

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

于 2016-06-07T13:45:41.280 回答
7

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

控制器/另一个Controller.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}]
于 2016-06-09T16:58:07.287 回答
6

我知道我回答这个问题有点晚了,只有 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 中使用全局变量

于 2020-07-04T21:07:21.117 回答
1

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

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

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

我还看到您需要main.jsintotal.jstotal.jsin 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.
于 2013-06-15T04:50:28.820 回答
1

一个可行但不推荐的小技巧是使用process变量。您可以对其应用不同的属性,并基本上像使用window基于浏览器的 JS 中的对象一样使用它们。这个小技巧将提供对变量的引用。它可以更改和操作,并且更改将延续到所有required 文件。

但请注意,不建议这样做,因为覆盖process变量可能会产生一些意想不到的影响,并且如果另一个进程干扰,可能会丢失信息。


文件 1.js:

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

文件2.js:

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

输出

file1 2

file2 3

file1 3

于 2019-02-08T06:43:39.253 回答
0

或者,对于所有其他答案

获取者和设置者

var _variableThing = 1223

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

  set variableThing(val){
    _variableThing = val
  }
}

虽然不适用于直接进口

于 2019-05-08T17:33:59.673 回答