节点js – 用户之间共享模块?

鉴于以下模块:

module.exports = function() { var env; var module = {}; module.setEnv= function(myEnv) { env = myEnv; // env may be set to a different value per user } module.doActionWithEnv = function() { ... } ... return module; } 

我需要这样的模块:

 var myModule = require('/myModule')(); 

现在我的问题是,我的模块共享2个不同的用户访问该网站? 我的意思是,如果一个用户设置私有envvariables,然后另一个调用依赖于env的模块内的某个函数,从而得到错误的结果,会发生冲突吗?

谢谢。

服务器上的variables通常每个服务器进程一次,而不是每个用户发出请求一次。 像传递给请求处理程序的reqres对象的一些variables是唯一地为每个请求创build的。 每个用户variables通常需要某种会话pipe理层来允许服务器识别哪个用户正在发出请求,然后访问为该特定用户存储的数据。 您可以阅读Express Sessions或Node.js,Express会话或Express.js会话 -关于在Express中使用会话的更多信息的详细教程 ,还有一些NPM模块用于实现与Express的会话,但express-session可能是最stream行。


要解释你的代码,在你的代码的这一行:

 var myModule = require('/myModule')(); 

对于每次调用,您都将获得一个新的myModule 。 所以,每次调用模块构造函数时,都会得到一个新的myModule对象,其中包含一个新的env

但是,如果只调用一次该构造函数,并且在代码中只有一个myModulevariables,并且代表不同用户的多个来自Web服务器的请求都使用相同的myModulevariables,则它们将共享相同的myModule对象,从而它里面的envvariables是一样的。


是什么让你的情况有点混淆的是,当您require('/myModule')创build的node.js中的模块被caching并在node.js中共享。 因此,就node.js系统而言,只有一个实际的myModule.js加载模块。 但是,每次调用模块构造函数时,您自己的代码都会创build一个新的对象(也称为module ,使事情变得混乱)。 所以,如果你调用这个构造函数5次,例如:

 var m = require('/myModule'); var x1 = m(); var x2 = m(); var x3 = m(); var x4 = m(); var x5 = m(); 

甚至:

 var x1 = require('/myModule')(); var x2 = require('/myModule')(); var x3 = require('/myModule')(); var x4 = require('/myModule')(); var x5 = require('/myModule')(); 

然后,你将在variablesx1x5有5个独立的对象,每个对象都有自己的envvariables。


但是,如果你只是这样做一次:

 var myObj = require('/myModule')(); myObj.setEnv("hello"); 

然后,多个请求处理程序都会引用这个myObj对象:

 app.get('/request1', function(req, res) { myObj.setEnv("goodbye"); }}; app.get('/request2', function(req, res) { myObj.setEnv("adios"); }}; 

然后,无论用户发起请求,这两个请求处理程序都将在相同的myObj对象上运行。


那么我怎样才能避免这个问题呢?

如果你想要每个用户的信息存储在你的服务器上,那么你通常会使用sessions 。 虽然实现会话的方法有很多,但他们通常会在每个用户的浏览器第一次访问您的网站时为其设置一个唯一的Cookie。 那么服务器上就有一个存储机制,可以通过该cookie值访问属于该用户的数据。 你不使用普通的JSvariables来存储每个用户的状态。 您通常会使用对象查找(通过Cookie ID)或某种数据库。

由于它看起来像使用Express,因此有几个NPM模块将挂钩到Express并为您实施会话。 Express的最stream行的会话实现是快速会话。