在使用nodejs和 socket.io 的聊天应用程序中,我需要在不同的模块之间共享变量,以便从一个文件修改的值应该从另一个文件访问。我的应用程序的工作流程如下。
在主应用程序中.js我包含一个用于验证"用户.js"的控制器文件,其中我使用了一个变量,例如 var onlineusers ={};每次登录时,该值将插入到此变量中。为了处理套接字聊天,我使用了另一个名为 chat 的控制器文件.js我需要在其中使用相同的变量 onlineusers。
现在考虑 3 个文件应用程序.js,用户.js,聊天.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
}
我需要的是在不同的模块(用户.js和聊天.js之间共享变量var onlineusers值
我要做的是更改聊天.js和用户.js.set函数以接受另一个称为onlineUsers的参数。然后,从应用程序中.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);
这只会在一定程度上起作用。我强烈考虑使用数据库进行此类工作。对于使用node和 socket.io 管理在线用户,我发现mongodb和redis都是非常好的选择。这样做的好处是您的 onlineUsers 集合是基于数据库的,而不是在应用程序内存中使用 onlineUsers 变量。然后,您的应用程序可以只访问数据库,而不是"共享"变量。