node js - 是用户之间共享的模块吗?

Mis*_*r_L 1 node.js express

给出以下模块:

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;
}
Run Code Online (Sandbox Code Playgroud)

我需要这样的模块:

var myModule = require('/myModule')();
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

jfr*_*d00 5

服务器上的变量通常是每个服务器进程一次,而不是每个用户发出一次请求.传递给请求处理程序的一些变量(例如reqres对象)是为每个请求唯一创建的.每个用户变量通常需要某种会话管理层,以允许服务器识别正在发出请求的用户,然后访问为该特定用户存储的数据.您可以阅读快递会话Node.js的和快速会话一个详细的教程- Express.js会议关于快递使用会话获取更多信息,并有许多的NPM模块实现与快递会议虽然express-session可能是最流行的.


要解释您的代码,请在以下代码行中:

var myModule = require('/myModule')();
Run Code Online (Sandbox Code Playgroud)

myModule每次打电话都会得到一个新的.因此,每次调用该模块构造函数时,都会得到一个新的myModule对象,其中包含一个新的对象env.

但是,如果你只是调用构造函数一次,并且只有一个myModule变量在你的代码,并从Web服务器代表不同用户的多个请求都使用相同的Mymodule中的变量,那么它们都将共享相同的myModule对象,因而有相同env里面的变量.


是什么让你的情况有点混乱,你require('/myModule')在node.js中缓存和共享时创建的node.js中的模块.因此,就myModule.jsnode.js系统而言,只有一个实际加载的模块.但是,每次调用模块构造函数时,您自己的代码都会创建一个新对象(您也将module其命名为令人困惑的对象).所以,如果你调用那个构造函数5时间如下:

var m = require('/myModule');
var x1 = m();
var x2 = m();
var x3 = m();
var x4 = m();
var x5 = m();
Run Code Online (Sandbox Code Playgroud)

甚至:

var x1 = require('/myModule')();
var x2 = require('/myModule')();
var x3 = require('/myModule')();
var x4 = require('/myModule')();
var x5 = require('/myModule')();
Run Code Online (Sandbox Code Playgroud)

然后,你将不得不在5个变量不同的对象x1,通过x5每个都会有自己的env内部变量.


但是,如果你只做一次:

var myObj = require('/myModule')();
myObj.setEnv("hello");
Run Code Online (Sandbox Code Playgroud)

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

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

app.get('/request2', function(req, res) {
    myObj.setEnv("adios");
}};
Run Code Online (Sandbox Code Playgroud)

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


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

如果您希望存储在服务器上的每用户信息,那么您通常会使用sessions.虽然有很多方法可以实现会话,但他们通常会在每个用户首​​次访问您的网站时为其设置唯一的Cookie.然后,服务器上有一个存储机制,可以访问属于具有该cookie值的用户的数据.您不使用普通的JS变量来存储每个用户的状态.您通常会使用对象查找(通过cookie ID)或某种类型的数据库.

由于看起来您正在使用Express,因此有几个NPM模块将挂钩到Express并为您实现会话.Express最受欢迎的会话实现是快速会话.