我在不同的函数中使用id变量。 id在函数外部定义。接收到多个同时请求时,这可能导致变量被覆盖吗?在浏览器中而不是在Node.js中完成此行为时,行为是否相同?

var id;
server.get('/myapp', function (req, res, next) {
    id = uuid.v4();
}

最佳答案

是的,它会引起冲突

如果您的请求处理程序中包含任何异步操作,这些操作允许同时运行多个请求,则为“是”,使用一个以上可以访问的模块级别变量将导致冲突,并且一个请求可能被删除另一个人正在使用的变量。

简而言之,不要这样做

模块级变量仅适用于所有请求都可以安全访问和共享的数据。单个请求的数据应该在请求处理程序中,或者在请求或响应对象或某个类似类型的对象上的属性中,每个对象均应按此属性,并且不应在多个请求之间共享。

仅在处理请求期间需要的数据

因此,如果您只需要在此特定请求期间访问某些数据,则可以将其放在请求处理程序内的局部变量中,并将其传递给在处理该请求时可能需要调用的其他任何函数。或者,您可以将其分配为req对象上的属性,该属性对于每个单独的请求都是唯一的,然后将req对象传递给您正在调用的任何其他需要访问数据的函数。

从一个请求到下一个请求所需的数据,但每个用户的数据不同

如果您试图跟踪某个特定客户端从一个请求到另一个请求的某些数据,则根本无法以这种方式存储数据。您可能需要使用会话管理器,以便可以创建一个持久会话,该会话可以与一个特定浏览器从一个请求到另一个请求相关联。 express-session是一个流行的会话管理器,它非常简单。

会话管理器的工作方式是,给定浏览器第一次访问您的服务器时,会为其分配一个唯一的cookie。该Cookie包含一个加密的会话ID。然后,会话管理器创建一个由该会话ID索引的会话对象。当来自同一浏览器的第二个请求进入时,express-session会获取先前设置的cookie,解密sessionID,查找相应的会话对象,然后让您访问代表该对象存储在会话对象中的任何数据特定用户。

关于javascript - Node.js中的模块范围-同时Express请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42312706/

10-14 12:36
查看更多