在使用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值
答案 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变量。然后你的应用程序可以只访问数据库,而不是"共享"变量。