在Node.js Express

时间:2016-09-06 02:06:00

标签: node.js express

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

这是情景:
在ExpressJs中,我有一个常用的函数,它用于处理带有'req'对象的东西,但不会将req传递给它。

module.exports = {
    get: function(){
        var req = global.currentRequest;
        //do something...
    }
}

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

// in app.js
app.use(function (req, res, next) {
    global.currentRequest= req;
    next();
});

但我不知道它是否好?任何人都可以提出建议吗? 非常感谢!

3 个答案:

答案 0 :(得分:4)

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

将其存储在全局中根本不起作用,因为如果任何请求在处理过程中使用异步调用而多个请求可以同时处理,那么多个请求将相互踩踏,从而难以追踪错误。这里没有捷径。将当前请求作为参数传递给任何需要它的代码。

您无法将特定于请求的数据放入node.js中的全局数据中。这样做将为两个同时在飞行中的请求创建机会,以便彼此踩踏,并使数据在请求之间混淆。请记住,这是一个服务器,可能会处理许多客户端的请求。您不能对服务器使用同步,一次一个的思考。 node.js服务器可能同时在飞行中有许多请求,因此普通全局变量不能用于特定于请求的数据。

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

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

答案 1 :(得分:0)

而不是与全局变量一起使用,这绝不是最好的主意, 你可以将module.exports包裹起来接受req作为参数。

module.exports = function (req) {
    function get() {
        // it has access to req.
        console.log(req);
    }

    return get;
}

您可以require上述模块

app.use(function (req, res, next) {
    const mod = require('/path/to/module')(req);
    next();
});

答案 2 :(得分:0)

实际上,这可以通过global-request-context

之类的东西来实现

这是使用zone.js的,它使您可以在异步任务之间持久保存变量。