【发布时间】:2018-12-04 18:04:06
【问题描述】:
我知道一个可以在 ExpressJS 处理程序中在 res.send 之后调用 next,但在任何情况下 res.send 是否“自动”调用 next?
我有以下代码
const express = require('express');
var app = express();
app.get('/', (req, res, next) => {
console.log('in route handler')
res.send('Hello World')
});
app.use((req,res, next) => {
console.log('in middleware')
console.log('...........')
})
app.listen(process.env.PORT || 8080)
我的控制台日志是
in route handler
in middleware
...........
如果我确实在res.send 之后明确调用next,我会得到
in route handler
in middleware
...........
in middleware
...........
因此看起来中间件被调用了两次。
这是为什么?是因为中间件也以某种方式“直接”调用,而不管路由如何?也就是说,它只是 always 被调用,即使它在路由处理程序之后?但我想如果是在路由处理程序之后,要到达中间件,它前面的路由处理程序必须调用next,就像这里的https://derickbailey.com/2016/05/09/in-what-order-does-my-express-js-middleware-execute/,它说“事实证明,添加中间件的顺序很重要. 并且由于第二个 'use' 方法是在 'get' 处理程序之后添加的,因此它永远不会被调用。'get' 处理程序在呈现页面时会短路中间件,从而阻止处理任何进一步的中间件。”
Express 版本 4.16.0,Node 版本 11.2.0
感谢您的澄清!
【问题讨论】:
-
好像和火狐有关——我用火狐测试过,结果如上。今天我使用 Chrome 进行了测试,结果“符合预期”,即如果您在发送一个中间件后没有调用
next,则不会调用下一个。
标签: node.js express middleware