为什么请求对象通常表示为“req”,在整个应用程序生命周期中保持不变?您可以在回调中看到此变量,其中包含函数(req,res,next)等签名 如果我将一个变量附加到该req对象,例如req.user,那么该用户对象似乎在整个应用程序中都存在,是真的,如果是这样的话,为什么呢?
仅这样的app.use是真的吗?
app.use(function (request, response, next) {
request.user= user;
next();
});
答案 0 :(得分:3)
它在整个应用程序生命周期中都不一样,并且在整个中间件堆栈中都是一样的。 Express基于Connect,而connect带来了#34;中间件堆栈" - 您注册的函数可以执行请求/响应,并且能够传递(或不传递)工作到中间件的下一层。 "堆栈中的所有功能"对相同的请求/响应进行操作,但每个新请求都会产生新的请求/响应对象实例。
基本上,答案是"因为Connect旨在以这种方式工作"
答案 1 :(得分:2)
请求对象在整个请求生命周期内都是相同的,而不是应用程序生命周期 例如你有这样的路线,有两个中间件(可以是任意数字)
app.get("/profile", authenticate, UserController.profile);
现在只要路径/profile
上有请求,我们就会按顺序调用两个函数authenticate
和UserController.profile
。
并且会将三个参数传递给每个函数req
,res
,next
但是如何表达知道第一个功能是否已完成其执行?它知道使用next
回调。因此,当authenticate
调用next()
时,express知道函数执行已完成,并将使用相同的参数调用UserController.profile
。
由于req
是一个对象,并且每个回调都传递相同的req
对象,因此您在该对象中所做的任何更改都将可用于该特定请求的每个中间件/回调快速调用。 / p>
仅这样的app.use是真的吗?
不,路线方法也是如此。仅当路由匹配时才调用路由方法,而为每个请求调用app.use
中间件。