我正在创建一个node.js服务器,其中我有一个“通知”模块。节点服务器上的每个请求都将调用此模块,我需要为每个单独的调用设置一组私有变量。
例如,当向通知模块发出请求时,它需要记住用户ID,请求时间,会话ID等。
我怎样才能有效地做到这一点?
如果我在模块范围内简单地声明变量,它们似乎是为每个模块调用共享的。因此,它无法私下记住每个请求的数据。
我需要的是每次调用node.js模块时,它都会记住当时的数据。那么,请指出我该怎么做?
谢谢,
安键
node.js服务器将用作聊天服务器。 “notifications”模块将扫描db以获取新消息,并使用长轮询技术将输出以json格式发送到客户端。
我试图将数据和函数包装到一个对象中。然后,每次向聊天服务器发出请求时,都会创建一个新对象,并且它将继续执行所需的功能。但它所做的是,它不是并行工作,而是串行执行每个请求。所以,如果我向服务器发出3个请求,它们就会排队并一个接一个地执行。
有任何线索吗?
可以在此处找到模块源代码:http://www.ultrasoftbd.com/notifications.js
谢谢, 安键
答案 0 :(得分:0)
有几种方法可以解决这个问题:
1)让您的模块导出一个构造函数,该构造函数可以由模块的API用户调用,以便为它们提供一个新的对象实例。这样,每个用户都将拥有自己的对象实例,该实例具有自己的私有变量。
// Client example.
var mod = require('myModule')
, sess = new mod.Session();
sess.method(args);
sess.finalize();
2)让你的模块提供一个"注册表"这些私有变量的接口,包括调用者唯一的标识符。
// Client example.
var mod = require('myModule');
var id = mod.initialize(); // Returns a unique ID.
mod.method(id, args); // Each method requires the ID.
mod.finalize(id);
这些解决方案共享这样的想法,即模块会单独跟踪每个实例(或ID),以便可以按客户端实例计算统计信息(或模块执行的任何操作),而不是全局计算模块。