Node.js中的模块范围 - 同时快速请求

时间:2017-02-18 08:01:34

标签: javascript node.js

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

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

1 个答案:

答案 0 :(得分:1)

是的,它会导致冲突

如果您的请求处理程序中有任何异步操作允许同时有多个请求在飞行中,那么使用多个请求可能访问的模块级变量将导致冲突,并且请求可能会破坏另一个人正在使用的变量。

简而言之,不要这样做

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

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

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

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

如果您尝试跟踪某个特定客户端的一个请求到下一个请求的某些数据,那么您根本不能以这种方式存储它。您可能需要使用会话管理器,以便创建一个持久会话,该会话可以与一个特定浏览器从一个请求与下一个请求相关联。 express-session是一个很受欢迎的会话管理器,它非常容易。

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