在Node.js Express中随时随地访问当前的req对象

Sky*_*Sky 7 node.js express

我想知道如果回调中没有'req'参数,如何访问req对象。

这是场景吗?
在ExpressJs中,我有一个通用函数,它用于处理带有'req'对象的事物,但不将req传递给它。

module.exports = {
    get: function(){
        var req = global.currentRequest;
        //do something...
    }
}
Run Code Online (Sandbox Code Playgroud)

我当前的解决方案是我为所有请求编写一个中间件,将'req'放入全局变量,然后可以使用'global.currentRequest'在任何地方访问'req'。

// in app.js
app.use(function (req, res, next) {
    global.currentRequest= req;
    next();
});
Run Code Online (Sandbox Code Playgroud)

但我不知道这是否好?谁能提出建议?
非常感谢!

jfr*_*d00 6

唯一正确的方法是将req对象作为参数传递给需要它的所有函数。

将其存储在全局中根本无法工作,因为如果任何请求将异步调用作为其处理的一部分,则多个请求可以同时处理,并且这些多个请求会相互脚,从而难以跟踪错误。这里没有捷径。将当前请求作为参数传递给需要它的任何代码。

您永远无法将特定于请求的数据放入node.js中的全局变量。这样做将为同时进行的两个请求创造机会,使彼此之间相互脚,并使数据在请求之间变得混乱。请记住,这是一台可能正在处理许多客户端请求的服务器。您不能对服务器使用一次一次的同步思考。一个node.js服务器可能同时具有多个处于运行状态的请求,因此普通全局变量不能用于特定于请求的数据。

这里没有捷径。您只需要将req对象传递给需要它的函数即可。如果那意味着您必须更改几个中间函数的函数签名,那就可以了。那就是你要做的。这是解决此类问题的唯一正确方法。

在某些情况下,您可能可以使用闭包来“捕获”所需的req对象,然后在内部函数中使用它而不将其传递给那些内部函数,但这听起来并不像您的函数结构那样。我们必须查看更多您的实际/实际代码,才能知道是否有这种可能。