Nodejs共享不同模块的变量

时间:2017-01-09 06:43:19

标签: node.js socket.io global-variables

在使用nodejs和socket.io的聊天应用程序中,我需要在不同的模块之间共享变量,以便从其他文件访问在一个文件上修改的值。我的应用程序的工作流程如下。

在主app.js中,我添加了一个控制器文件,用于验证" users.js"其中我使用变量说例如var onlineusers = {};在每次登录时,该值都将插入此变量中。为了处理套接字聊天,我使用了另一个名为chat.js的控制器文件,我需要使用相同的变量onlineusers。

现在考虑3个文件 app.js,user.js的,chat.js

In app.js
var users = require('./users.js');
var chat = require('./chat.js');
users.set(app);
chat.set(app,io);


In user.js

module.exports.set = function(app) {
// var onlineusers  modified in some function
}

In chat.js

module.exports.set = function(app,io) {
// var onlineusers  modified in some function
}

我需要的是在不同模块(user.js和chat.js)之间共享变量var onlineusers值

1 个答案:

答案 0 :(得分:1)

我要做的是更改chat.js和user.js .set函数以接受另一个名为onlineUsers的参数。然后从app.js你可以将onlineUsers值传递给每个修改.set函数。

// In app.js
var users = require('./users.js');
var chat = require('./chat.js');
var onlineUsers = new require('./onlineUsers')();
users.set(app, onlineUsers);
chat.set(app,io, onlineUsers);

// In user.js
module.exports.set = function(app, onlineUsers) {
  // onlineusers modified in some function
};

// In chat.js
module.exports.set = function(app, io, onlineUsers) {
  // onlineusers modified in some function
};

// In onlineUsers.js
module.exports = function(params) {
  // constructor for onlineUsers data model
};

这是因为JavaScript按值传递。

'use strict';
let obj = {};
(function firstModifier(obj) { 
  obj.first = true;
})(obj);
console.log(obj);

这只会在一定程度上起作用。我强烈建议使用数据库进行此类工作。用于管理节点和用户的在线用户socket.io,我发现mongodb和redis都是非常好的选择。这样做的有益之处在于您的onlineUsers集合是数据库而不是在应用程序内存中使用onlineUsers变量。然后你的应用程序可以只访问数据库,而不是"共享"变量。