在中间件中使用 await 的核心做法是确保中间件函数本身被声明为 async,这样框架或执行引擎就能正确识别并等待异步操作的完成。以 koa 为例,只需将中间件定义为 async (ctx, next) => { ... },在内部直接对需要等待的 promise(如数据库查询)使用 await 即可。

Koa 中间件中 await 的执行顺序是怎样的
在 Koa 中,await next() 会暂停当前中间件的后续代码执行,直到下游所有中间件执行完毕。这种机制允许你在请求进入前和响应返回后分别执行逻辑。

const Koa = require('koa');
const app = new Koa();
// 模拟一个耗时的异步操作
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
app.use(async (ctx, next) => {
console.log('Before next()');
await delay(1000); // 模拟处理时间
await next(); // 等待下游中间件
console.log('After next()');
ctx.body = 'Done';
});
app.listen(3000);运行上述代码并访问 localhost:3000,控制台输出顺序为:
1. Before next()
2. After next()
这证明了 await next() 之后的代码是在下游中间件完成后才执行的。
立即学习“Java免费学习笔记(深入)”;
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
Express 中间件中如何处理 async/await
Express 默认不自动处理中间件中的 Promise 异常,因此在使用 await 时通常需要包装错误处理逻辑或使用第三方库如 express-async-handler。如果不处理未捕获的异常,应用可能会崩溃。

const express = require('express');
const app = express();
app.get('/', async (req, res, next) => {
try {
const data = await fetchData(); // 假设这是一个返回 Promise 的函数
res.json(data);
} catch (err) {
next(err); // 必须手动传递错误给错误处理中间件
}
});
app.listen(3000);在 Express 中,如果 fetchData 抛出异常且未被 try...catch 捕获,Express 不会自动拦截它,导致进程退出。因此,显式的错误传递至关重要。
当 await 后的 Promise 被拒绝时会发生什么
如果在 Koa 或 Express 的中间件中,await 后面的 Promise 被拒绝(reject),且没有相应的 try...catch 块,程序会抛出未捕获的异常。在 Koa 中,这通常会被顶层错误处理中间件捕获;在 Express 中,则可能导致服务器崩溃,除非配置了全局错误处理器。

















