如何在 node/express 中访问客户端和服务器上的全局变量?

How to access a global variable on client and server in node/express?

假设我有一个变量 x,它是在 express 中间件中根据请求 req.x 设置的。我们可以通过模板 <%- window.x = req.x %> 将其公开给客户端。

我现在想在全局范围内使用这个变量。在客户端,我们可以直接使用 x 因为它在 window 上下文中。但是在服务器上,如果没有 window 或全局上下文,我们如何做同样的事情呢?

我们无法在 Node 中的 globals 对象上设置它,因为它确实是全局的,而不是请求的全局对象。

没有全局请求这样的东西。因为在 node.js 中可以同时处理许多请求,所以除了请求对象本身之外,没有地方可以存储对请求来说是全局的东西。

因此,这里通常的解决方案(以及一般的 OO 处理方式)是将请求对象传递给任何需要特定请求状态的对象。然后这些函数可以访问请求对象上所需的任何状态。

您可以制作某种全局存储查找,允许您在全局存储某些内容,然后能够在给定某些键(例如给定请求的用户 ID 或给定请求的某些 cookie 值)的情况下查找它).这基本上就是持久会话数据的存储方式。但是,如果你试图访问特定于用户或请求的数据,你将不得不将一些东西传递给任何需要该信息的函数,这些信息可以用作查找正确的键全局存储中的数据,因为一次可以有许多活动请求。

虽然 node.js 基本上是单线程的,但只要您在请求处理程序中进行任何类型的异步调用(从磁盘异步读取或进行网络连接或设置计时器),其他请求就有机会开始 运行 许多人可以同时飞行。因此,无法将通用全局状态与任何给定请求相关联。

解决这个问题的通常方法是将这个状态传递给可能需要它的其他函数:

app.get("somepath", function(req, res) {
     callSomeFunc(req);
});

function callSomeFunc(request) {
    callSomeOtherFunc(request);
}

function callSomeOtherFunc(r) {
    // access request info from the r argument here
}