在 Express.js 应用里,中间件就是一类可以访问请求对象、响应对象以及下一个中间件函数的函数。其中下一个中间件函数通常命名为 next,它是理解整个请求处理流程的关键。通过分析 next 的调用规则和中间件的执行顺序,我们可以更准确地控制接口行为。

中间件的基本形态
一个典型的中间件接收三个参数:req、res 和 next。框架会按照 app.use 或路由方法注册的先后顺序,依次把请求交给这些函数。只有当某个中间件调用了 next,控制权才会往后传递。
const express = require('express');
const app = express();
// 第一个中间件
app.use((req, res, next) => {
console.log('进入第一个中间件');
req.startTime = Date.now();
next(); // 交给下一个中间件
});
// 第二个中间件
app.use((req, res, next) => {
console.log('进入第二个中间件');
next();
});
app.get('/', (req, res) => {
res.send('请求处理完成,耗时:' + (Date.now() - req.startTime) + 'ms');
});
app.listen(3000);
next() 参数的作用
next 本身是一个函数。调用它可以显式地声明当前中间件已经处理完毕,请框架继续执行后续匹配的中间件或路由。如果中间件既不调用 next,也不向客户端发送响应,请求就会处于挂起状态,直到超时。
不调用 next 的后果
- 客户端一直等待响应
- 服务器连接被占用
- 日志中看不到后续中间件执行记录
错误传递机制
如果给 next 传入一个参数,Express 会认为发生了错误,并跳过后续普通中间件,直接寻找错误处理中间件。这种方式让我们能统一捕获异步或同步异常。
app.use((req, res, next) => {
try {
// 模拟出错
throw new Error('数据解析失败');
} catch (err) {
next(err); // 传入错误对象
}
});
// 错误处理中间件,参数包含 err
app.use((err, req, res, next) => {
console.error(err.message);
res.status(500).send('服务器内部错误');
});
中间件执行顺序示例
下面用一个表格说明请求进入后,不同写法对执行流程的影响:
| 中间件写法 | 是否调用 next | 执行结果 |
|---|---|---|
| 普通日志中间件 | 是 | 继续后续逻辑 |
| 鉴权失败直接 res.send | 否 | 结束响应,不再传递 |
| 异步查询出错 next(err) | 传参调用 | 进入错误处理中间件 |
在路由级别使用 next
除了全局 app.use,我们也可以在单个路由里挂载多个处理函数,它们同样通过 next 串联。
app.get('/user',
(req, res, next) => {
if (!req.query.token) {
res.status(401).send('缺少 token');
return;
}
next();
},
(req, res) => {
res.send('用户信息接口正常返回');
}
);
小结
理解 Express.js 中间件的 next 参数,核心在于明白它是一个流程控制器:调用 next 继续,不调用且未响应就暂停,传入错误就跳转错误处理。结合注册顺序和分层设计,可以让服务端逻辑既灵活又易于维护。
Express_js中间件next函数修改时间:2026-07-27 16:12:22