[英]Node.js Express app - request object
為什么通常用“ req”表示的請求對象在整個應用程序生命周期中保持不變? 您可以在帶有諸如function(req,res,next)之類的簽名的回調中看到此變量,如果我將變量附加到該req對象(如req.user),則該用戶對象似乎在整個應用程序中都存在,是否為真,如果是,為什么?
這樣僅適用於app.use嗎?
app.use(function (request, response, next) {
request.user= user;
next();
});
在整個應用程序生命周期中,它是不同的,在整個中間件堆棧中,它是相同的。 Express是基於Connect的,而connect帶來了“中間件堆棧”的概念-您注冊具有請求/響應功能並能夠傳遞(或不傳遞)中間件中下一層功能的函數。 “堆棧”中的所有功能都對相同的請求/響應進行操作,但是每個新請求都會導致請求/響應對象的新實例。
基本上,答案是“這是因為Connect設計為以這種方式工作”
在整個請求生命周期中,請求對象將是相同的,而不是應用程序生命周期。
例如,您有一條帶有兩個中間件的路由(可以是任意數量)
app.get("/profile", authenticate, UserController.profile);
現在,只要在路徑/profile
上有請求,express就會依次調用兩個函數authenticate
和UserController.profile
。
並將三個參數傳遞給每個函數req
, res
, next
。
但是如何表達知道第一個功能是否已完成執行? 它知道使用next
回調。 因此,當authenticate
將調用next()
express知道函數執行已完成,並將使用相同的參數調用UserController.profile
。
由於req
是一個對象,並且每個回調都傳遞相同的req
對象,因此您對該對象所做的任何更改將可用於該特定請求的每個中間件/回調快速調用。
這樣僅適用於app.use嗎?
不,對於route方法也是如此。 僅當路由匹配時才調用路由方法,而為每個請求調用app.use
中間件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.