JavaScript异步中间件需返回Promise、接收ctx和next参数,支持await next()、ctx透传、错误抛出及配置化封装;典型应用包括日志统计、超时控制与错误兜底。

在 JavaScript 中,用 async/await 编写可复用的异步中间件,核心是让中间件函数返回一个 Promise,并能接收 next 函数(用于调用下一个中间件),同时支持错误传播和上下文共享(如 ctx 对象)。这类模式常见于 Koa、自定义请求管道或任务流系统。
设计统一的中间件签名
一个可复用的异步中间件应遵循标准结构:
- 接受两个参数:
ctx(上下文对象,用于传递数据和状态)和next(返回 Promise 的函数,代表后续中间件链) - 自身为
async函数,或显式返回Promise - 在适当位置
await next(),以等待后续逻辑完成 - 可通过修改
ctx实现数据透传(如ctx.user、ctx.startTime)
封装通用功能:日志与耗时统计
例如,一个带时间记录的日志中间件可这样写:
← ${ctx.path || 'unknown'} | ${ms}ms | ${ctx.status || 200}支持配置的中间件工厂函数
为提升复用性,把中间件包装成工厂函数,接受配置参数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const timeout = (ms = 5000) => {
return async (ctx, next) => {
const timer = setTimeout(() => {
ctx.status = 408;
ctx.body = { error: 'Request timeout' };
}, ms);
<pre class="brush:php;toolbar:false;">try {
await next();
} finally {
clearTimeout(timer);
}}; };
// 使用:app.use(timeout(3000))
错误处理与统一兜底
中间件链中任意环节抛错,都应被顶层捕获。Koa 默认支持;若手写管道,需手动包裹:
const compose = (middlewares) => {
return async (ctx) => {
const dispatch = (i) => {
if (i >= middlewares.length) return Promise.resolve();
const fn = middlewares[i];
return Promise.resolve(fn(ctx, () => dispatch(i + 1)))
.catch(err => {
ctx.err = err;
throw err;
});
};
return dispatch(0);
};
};这样,任一中间件内 throw new Error() 或 await Promise.reject() 都会中断流程并进入 catch 分支。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










