Node.js 节点js-用户之间是否共享模块?

Node.js 节点js-用户之间是否共享模块?,node.js,express,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() { ... } ..

鉴于以下模块:

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')();
现在我的问题是,我的模块是否在访问该站点的两个不同用户之间共享?我的意思是,如果一个用户设置私有env变量,而另一个用户调用依赖于env的模块内的某个函数,从而得到错误的结果,会发生冲突吗


谢谢

服务器上的变量通常是每个服务器进程一次,而不是每个发出请求的用户一次。一些变量(如传递给请求处理程序的req和res对象)是为每个请求唯一创建的。每用户变量通常需要某种会话管理层,以允许服务器识别发出请求的用户,然后访问为该特定用户存储的数据。您可以阅读或或了解有关在Express中使用会话的更多信息,并且有许多NPM模块用于使用Express实现会话,尽管Express会话可能是最流行的

要解释您的代码,请在代码的这一行中:

var myModule = require('/myModule')();
你将得到一个新的myModule为每一个调用。因此,每次调用该模块构造函数时,都会得到一个新的myModule对象,其中包含一个新的env

但是,如果只调用该构造函数一次,代码中只有一个myModule变量,并且来自web服务器的代表不同用户的多个请求都使用同一个myModule变量,那么它们将共享同一个myModule对象,从而在其中共享同一个env变量

让您的情况有点混乱的是,当您确实需要“/myModule”时创建的node.js中的模块在node.js中被缓存和共享。因此,就node.js系统而言,只有一个实际加载的myModule.js模块。但是,每次调用模块构造函数时,您自己的代码都会创建一个新对象,您也将其命名为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')();
然后,在变量x1到x5中有5个单独的对象,每个对象内部都有自己的env变量

但是,如果你只做一次:

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对象上运行

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

如果您希望在服务器上存储每个用户的信息,则通常使用会话。虽然有许多方法可以实现会话,但它们通常在每个用户首次访问您的站点时为其浏览器设置唯一的cookie。然后,服务器上有一个存储机制,可以使用该cookie值访问属于用户的数据。您不使用普通的JS变量来存储每个用户的状态。您通常会使用通过cookie ID的对象查找或某种数据库


因为看起来您正在使用Express,所以有几个NPM模块将连接到Express并为您实现会话。Express最流行的会话实现是Express sessions。

服务器上的变量通常是每个服务器进程一次,而不是每个发出请求的用户一次。一些变量(如传递给请求处理程序的req和res对象)是为每个请求唯一创建的。每用户变量通常需要某种会话管理层,以允许服务器识别发出请求的用户,然后访问为该特定用户存储的数据。您可以阅读或或了解有关在Express中使用会话的更多信息,并且有许多NPM模块用于使用Express实现会话,尽管Express会话可能是最流行的

要解释您的代码,请在代码的这一行中:

var myModule = require('/myModule')();
你将得到一个新的myModule为每一个调用。因此,每次调用该模块构造函数时,都会得到一个新的myModule对象,其中包含一个新的env

但是,如果只调用该构造函数一次,代码中只有一个myModule变量,并且来自web服务器的代表不同用户的多个请求都使用同一个myModule变量,那么它们将共享同一个myModule对象,从而在其中共享同一个env变量

让您的情况有点混乱的是,当您确实需要“/myModule”时创建的node.js中的模块在node.js中被缓存和共享。因此,就node.js系统而言,只有一个实际加载的myModule.js模块。但是,每次调用模块构造函数时,您自己的代码都会创建一个新对象,您也将其命名为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')();
然后,在变量x1到x5中有5个单独的对象,每个对象内部都有自己的env变量

但是,如果你只做一次:

var myObj = require('/myModule')();
myObj.setEnv("hello");
以及 en多个请求处理程序都引用myObj对象,如下所示:

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

app.get('/request2', function(req, res) {
    myObj.setEnv("adios");
}};
然后,无论是哪个用户发起请求,这两个请求处理程序都将在同一个myObj对象上运行

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

如果您希望在服务器上存储每个用户的信息,则通常使用会话。虽然有许多方法可以实现会话,但它们通常在每个用户首次访问您的站点时为其浏览器设置唯一的cookie。然后,服务器上有一个存储机制,可以使用该cookie值访问属于用户的数据。您不使用普通的JS变量来存储每个用户的状态。您通常会使用通过cookie ID的对象查找或某种数据库


因为看起来您正在使用Express,所以有几个NPM模块将连接到Express并为您实现会话。Express最流行的会话实现是Express sessions。

据我所知,如果您只有一个脚本实例,那么是的,两个用户将共享相同的状态。如果您只创建一个myModule,那么是的,它将在所有用户之间共享。导出一个函数确实允许您创建多个对象,但每次需要每个用户一个新对象时都需要调用该函数–var myModule=require'/myModule'。。。user.env=myModule;那么我该如何避免这个问题呢?据我所知,如果您只有一个脚本实例,那么是的,两个用户将共享相同的状态。如果您只创建一个myModule,那么是的,它将在所有用户之间共享。导出一个函数确实允许您创建多个对象,但每次需要每个用户一个新对象时都需要调用该函数–var myModule=require'/myModule'。。。user.env=myModule;那么我怎样才能避免这个问题呢?