【问题标题】:Node.js Express app - request objectNode.js Express 应用程序 - 请求对象
【发布时间】:2015-01-16 12:28:22
【问题描述】:

为什么通常表示为“req”的请求对象在整个应用程序生命周期中保持不变?您可以在带有 function(req,res,next) 等签名的回调中看到此变量 如果我将一个变量附加到该 req 对象,例如 req.user,那么该用户对象似乎存在于整个应用程序中,这是真的吗?如果是,为什么?

只有 app.use 是这样吗?

app.use(function (request, response, next) {
    request.user= user;
    next();
});

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    在“整个应用程序生命周期”中是不一样的,在整个中间件堆栈中都是一样的。 Express 基于 Connect,并且 connect 带来了“中间件堆栈”的概念——您注册的函数可以处理请求/响应,并且能够将工作传递(或不传递)到中间件的下一层。 “堆栈”中的所有函数都对相同的请求/响应进行操作,但每个新请求都会产生新的请求/响应对象实例。

    基本上,答案是“这是因为Connect 被设计成这样工作”

    【讨论】:

      【解决方案2】:

      请求对象在整个请求生命周期中都是相同的,而不是应用程序生命周期。
      例如你有一个这样的路由,有两个中间件(可以是任意数量)

      app.get("/profile", authenticate, UserController.profile);
      

      现在,只要在路径 /profile 上有请求,express 就会依次调用两个函数 authenticateUserController.profile
      并将三个参数传递给每个函数reqresnext
      但是 express 如何知道第一个函数是否已完成执行?它知道使用next 回调。因此,当authenticate 将调用next() 时,express 知道函数执行已完成,并将使用相同的参数调用UserController.profile

      由于req 是一个对象,并且每个回调都传递相同的req 对象,因此您对对象所做的任何更改都将适用于针对该特定请求的每个中间件/回调快速调用。

      只有 app.use 是这样吗?

      不,路线方法也是如此。只有当路由匹配时才会调用路由方法,而每个请求都会调用app.use 中间件。

      【讨论】:

        猜你喜欢
        • 2013-03-29
        • 2012-06-15
        • 2017-03-09
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 1970-01-01
        • 2017-02-07
        相关资源
        最近更新 更多