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

Jas*_*son 15 node.js express pug

我试图了解何时最好使用以下各项.这是我的基本理解:

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

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

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

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

Hec*_*rea 5

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

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

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

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

  • 那么您希望它们在所有视图中可用,但仅限于触发查询的用户?使用 `req.session` (同样,在你的问题中你已经回答了自己;-) (2认同)
  • @KaneSchutzman 在这种特殊情况下,用户想要触发 MongoDB 查询(并存储其结果),我认为这会在 Express 应用程序启动并运行时发生。如果您使用“cluster”(或者基本上是“fork()”)来处理 Express 路由,则一个子进程中对“app.locals”的更改将不会反映在其他子进程中。 (2认同)