为什么请求对象通常表示为"req",在整个应用程序生命周期中保持不变?您可以在带有function( req,res,next)等签名回调中看到此变量。如果我将一个变量附加到该请求对象(如req.user ),则该user对象似乎存在于整个应用程序中,这是真的吗?如果是,原因是什么?
是不是只有app.use是这样的呢?
app.use(function (request, response, next) {
request.user= user;
next();
});发布于 2014-11-19 13:05:42
它在“整个应用程序生命周期”中是不一样的,在整个中间件堆栈中都是一样的。Express是基于Connect的,connect带来了“中间件堆栈”的概念--您注册的函数对请求/响应执行某些操作,并且能够将工作传递(或不传递)到中间件中的下一层。“栈”中的所有函数都对相同的请求/响应进行操作,但每个新请求都会产生新的请求/响应对象实例。
基本上,答案是“这是因为Connect就是这样设计的”
发布于 2014-11-19 13:10:42
请求对象在整个请求生命周期中都是相同的,而不是应用程序生命周期。
例如,你有一个这样的路由,有两个中间件(可以是任何数量)
app.get("/profile", authenticate, UserController.profile);现在,只要路径上有请求,/profile express就会依次调用两个函数authenticate和UserController.profile。
并将向每个函数req、res、next传递三个参数。
但是express如何知道第一个函数是否已经完成执行呢?它知道如何使用next回调。因此,当authenticate调用next() express时,它知道函数执行已完成,并将使用相同的参数调用UserController.profile。
因为req是一个对象,并且每个回调都被传递给相同的req对象,所以您在该对象中所做的任何更改都将可用于该特定请求的每个中间件/回调快速调用。
只有这样的app.use才是这样的吗?
不,对于路由方法也是如此。路由方法仅在路由匹配时调用,而app.use中间件则为每个请求调用。
https://stackoverflow.com/questions/27009195
复制相似问题