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

时间:2015-12-02 00:14:51

标签: node.js express isomorphic-javascript

我们假设我有一个变量x,它是在快速中间件中的请求req.x上设置的。我们可以通过模板<%- window.x = req.x %>向客户端公开此内容。

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

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

1 个答案:

答案 0 :(得分:1)

请求没有全局性的东西。因为在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
}