为何已通过get发送响应,最后一个app.use仍执行console.log?
为什么访问/home时最后一个app.use中间件仍会执行?
这是因为Express的中间件和路由按代码注册顺序依次匹配执行,而且res.send()并不会自动终止整个中间件链的运行——除非你显式阻止后续执行。
具体执行流程:
- 第一个无路径的
app.use先执行,调用next()把请求传递给下一个匹配项。 - 请求匹配到
app.get('/home')路由,执行res.send()发送响应给客户端,但这个处理函数没有提前终止(比如没加return),函数执行完毕后,Express会继续检查后续的中间件。 - 最后一个无路径的
app.use会匹配所有请求,因此会被执行,输出console.log的内容(不过此时再调用res.send()会报错,因为响应已经发送过了)。
解决方法:
要阻止后续中间件执行,只需要在路由处理函数里加上return,让函数提前终止:
app.get('/home', (req, res) => { return res.send('<h1>Home Page</h1>'); });
或者,如果你需要更明确地跳过后续路由/中间件,可以使用next('route')(需要在处理函数中声明next参数):
app.get('/home', (req, res, next) => { res.send('<h1>Home Page</h1>'); next('route'); });
内容的提问来源于stack exchange,提问作者Ashu
相关产品推荐
相关产品推荐

