gpt4 book ai didi

node.js - Node js - 用户之间共享模块吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:24 24 4
gpt4 key购买 nike

给定以下模块:

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

谢谢。

最佳答案

服务器上的变量通常是每个服务器进程一次,而不是每个发出请求的用户一次。传递给请求处理程序的一些变量(例如 reqres 对象)是为每个请求唯一创建的。每个用户变量通常需要某种 session 管理层,以允许服务器识别哪个用户正在发出请求,然后访问为该特定用户存储的数据。您可以阅读Express SessionsNode.js and Express SessionsExpress.js Sessions – A Detailed Tutorial有关在 Express 中使用 session 的更多信息,并且有许多用于使用 Express 实现 session 的 NPM 模块,尽管 express-session 可能是最受欢迎的。

<小时/>

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

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

每次调用您都会获得一个新的myModule。因此,每次调用该模块构造函数时,您都会获得一个新的 myModule 对象,其中包含一个新的 env

但是,如果您只调用该构造函数一次,并且代码中只有一个 myModule 变量,并且代表不同用户的来自 Web 服务器的多个请求都使用相同的 myModule 变量,那么它们都将共享相同的 myModule 对象,因此其内部具有相同的 env 变量。

<小时/>

让您的情况有点令人困惑的是,当您执行require('/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')();

然后,您将在变量 x1x5 中拥有 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 对象上运行。

<小时/>

How can I avoid this problem then?

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

由于看起来您正在使用 Express,因此有几个 NPM 模块将连接到 Express 并为您实现 session 。 Express 最流行的 session 实现是express-sessions。

关于node.js - Node js - 用户之间共享模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com