node.js模块变量是否在多个调用之间共享?

时间:2011-06-19 15:43:00

标签: variables node.js module

我正在创建一个node.js服务器,其中我有一个“通知”模块。节点服务器上的每个请求都将调用此模块,我需要为每个单独的调用设置一组私有变量。

例如,当向通知模块发出请求时,它需要记住用户ID,请求时间,会话ID等。

我怎样才能有效地做到这一点?

如果我在模块范围内简单地声明变量,它们似乎是为每个模块调用共享的。因此,它无法私下记住每个请求的数据。

我需要的是每次调用node.js模块时,它都会记住当时的数据。那么,请指出我该怎么做?

谢谢,
安键

更新

node.js服务器将用作聊天服务器。 “notifications”模块将扫描db以获取新消息,并使用长轮询技术将输出以json格式发送到客户端。

我试图将数据和函数包装到一个对象中。然后,每次向聊天服务器发出请求时,都会创建一个新对象,并且它将继续执行所需的功能。但它所做的是,它不是并行工作,而是串行执行每个请求。所以,如果我向服务器发出3个请求,它们就会排队并一个接一个地执行。

有任何线索吗?

可以在此处找到模块源代码:http://www.ultrasoftbd.com/notifications.js

谢谢, 安键

1 个答案:

答案 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),以便可以按客户端实例计算统计信息(或模块执行的任何操作),而不是全局计算模块。