Express.js:app.locals vs res.locals vs req.session

Posted

技术标签:

【中文标题】Express.js:app.locals vs res.locals vs req.session【英文标题】:Express.js: app.locals vs res.locals vs req.session 【发布时间】:2013-02-24 01:16:47 【问题描述】:

我试图了解何时最好使用以下各项。这是我的初步理解:

app.locals -- 适合在应用级别存储全局变量。所有用户/会话将看到这些变量的相同值。变量可用于所有视图。

res.locals -- 适合存储特定请求/响应周期的变量。这些变量仅对与响应关联的视图可用。

req.session -- 适合存储与唯一用户会话相关的变量(例如,用户名)。这些变量应该可用于唯一用户/会话的所有视图。

我的具体用例如下:用户运行从 mongodb 检索数据的查询。我现在想要这个查询的结果,它是一个 JSON 数组,可用作所有视图(HTTP 请求)的变量。 “存储”结果数组以便每个视图都可以访问它的最佳方式是什么?

【问题讨论】:

你自己回答了这个问题。 req.locals 用于当前请求的视图中应该可用的数据。 【参考方案1】:

我现在想要这个查询的结果,它是一个 json 数组, 可作为所有视图的变量。是什么 “存储”结果数组以便每个视图都可以访问它的最佳方式?

当您说“可用于所有视图”时,我假设您的意思是所有 HTTP 请求。如果是这种情况,那么您需要注意 HTTP 是一种无状态协议,并且不提供此功能。您需要为此开发自己的机制。

执行此操作的一种方法是在服务器上缓存此信息(数组)并在每次请求时检索它(例如,从内存而不是从 MongoDB 中检索它)。您将在 cookie 上存储一个会话 ID,并在另一个请求通过时基于此 ID 从缓存中获取它。有几种可用的缓存工具(例如 redis、memcached 等),您可以选择将信息存储在内存中。

您还可以对这些信息(数组本身)进行 cookie,在这种情况下,它将在每个 HTTP 请求上在客户端和服务器之间来回发送,除非数据非常好,否则很可能不是一个好主意小的。

【讨论】:

如果你将数据存储在app.locals,并且不运行多个Node进程(即你不使用cluster),它将对所有视图可用,甚至跨请求。 @robertklep -- 这就是我最初所做的,将数据存储在 app.locals 中,但随后我用两台发出 HTTP 请求的 PC 进行了测试,它们都看到了相同的数据!我不想在客户端之间共享数据。 所以您希望它们在所有视图中都可用,但仅适用于触发查询的用户?使用req.session(同样,在你的问题中你已经回答了自己;-) @JasonGelinas 如果将其存储在 app.locals 中,则需要存储与其关联的“会话 ID”,以便在下一个请求中获取该特定值。 @KaneSchutzman 在这种特殊情况下,用户想要触发 MongoDB 查询(并存储其结果),我认为这将在 Express 应用程序已经启动并运行时发生。如果您使用cluster(或者基本上是fork())来处理您的Express 路由,那么在一个子流程中对app.locals 的更改将不会反映在其他子流程中。

以上是关于Express.js:app.locals vs res.locals vs req.session的主要内容,如果未能解决你的问题,请参考以下文章

express 笔记 app.helpers 和 app.locals

Node.js + Express.js |尝试设置 HTTPS 服务器

EXPRESS.JS再出发

express js 可以做啥

Express.js- 为啥是 localhost '::'

node.js 和 express 的区别