【问题标题】:Nodejs sharing of variable accross different modulesNodejs跨不同模块共享变量
【发布时间】:2017-05-23 09:06:33
【问题描述】:

在我使用 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 值

【问题讨论】:

  • 将变量存储在一个模块中并导出一个检索值的方法。然后,您可以从任一模块获取相同变量的值。
  • 再查询一个,在线人数增加会不会影响性能。我还需要为房间使用变量
  • 不,这不会影响性能,因为在线用户会以任何方式增加。在您的服务器期间加载了一个模块实例。您只是在创建一个访问器函数来获取存储在模块中的一些数据。这是共享数据的一种常见且良好的方式,没有可扩展性方面的缺点。

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


【解决方案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);

这只会在一定程度上起作用。我强烈考虑将数据库用于此类工作。对于使用 node 和 socket.io 管理在线用户,我发现 mongodb 和 redis 都是非常好的选择。这样做的好处是您的 onlineUsers 集合是数据库化的,而不是在应用程序内存中使用 onlineUsers 变量。然后您的应用程序可以只访问数据库而不是“共享”变量。

【讨论】:

  • 感谢您的回答。一个问题,您对在单独的文件“onlineUsers.js”中使用全局变量(如您上面提到的而不是数据库)有何看法。如果我们使用数据库,它可能会在不同的更新和获取并发问题时导致执行延迟?所以我打算使用变量,但我很担心你为什么说“变量会在一定程度上发挥作用”
  • 它将在一定程度上起作用,因为您仅限于应用程序内存。这很适合您的使用。如果您有很多在线用户并且在每个用户上存储大量数据(即一组大对象),那么节点进程的一个实例可能无法完成这项工作。见stackoverflow.com/questions/7193959/…。我认为使用上面的 onlineUsers.js 或使用 @jfriend00 的方法非常好,如果您不希望管理那么多用户。
  • 我将补充一点,通过将在线用户数据存储在一个节点进程内的变量中,当该进程终止时,您将丢失所有数据。因此,如果这是为了学习体验或小型项目,它很酷 - 但你不能对用户群做这样的事情并期望得到好的结果。
  • @Ajith 除了 Yod 所说的之外,如果您的 Redis 节点很接近,则类似 Redis 的开销可能只有几毫秒。例如。在 AWS 上,从 Node 应用程序到 Redis 的延迟为 1-2ms。添加一些管理开销,它仍然可能低于 5 毫秒。所以你不应该害怕。
  • 另外一点是,如果您担心负载会达到并发和延迟,您的内存中可能会卡住。
猜你喜欢
  • 2016-07-07
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2012-10-31
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多