异步错误处理需串联异步流程、错误分类与响应策略:用express+async/await搭建骨架,定义operationalerror(可恢复)和programmererror(不可信),路由中try/catch捕获后交由集中中间件分级处置。

直接上手做,不绕弯。异步错误处理不是单独学一个语法,而是把 异步流程、错误分类 和 响应策略 三者串起来落地。下面是一个可立即启动的实战项目结构,覆盖 Express + async/await + 自定义错误类 + 集中错误中间件,全部基于生产环境真实逻辑。
一、搭骨架:初始化项目与基础路由
用 Node.js 20.x LTS(推荐)初始化:
- 运行
npm init -y,安装express和dotenv - 创建
app.js,配置基本服务器和 JSON 解析中间件 - 加一条测试路由:
app.get('/test', async (req, res) => { throw new Error('模拟程序错误'); })—— 先让它崩,再修它
二、建错误体系:区分操作型 vs 程序型错误
在 errors/ 目录下定义两个核心类:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
OperationalError.js:继承Error,带statusCode(如 400、422)、isOperational: true标记 -
ProgrammerError.js:同样继承Error,但isOperational: false,用于未预期的 bug(如user.name.toUpperCase()报错) - 所有业务层主动抛出的错误,只用
OperationalError;框架层或未捕获异常默认视为ProgrammerError
三、写异步路由:用 async/await + try/catch 控制流
以短信发送为例(参考阿里云 SDK 封装):
- 封装
sendSms(mobile, code)为返回 Promise 的函数 - 在路由中这样写:
app.post('/sms', async (req, res, next) => {<br> try {<br> const result = await sendSms(req.body.mobile, req.body.code);<br> res.json({ success: true, data: result });<br> } catch (err) {<br> if (err instanceof OperationalError) return next(err);<br> next(new ProgrammerError(err.message)); // 统一兜底<br> }});
四、设集中式错误中间件:统一响应 + 分级处置
在 app.js 最底部添加:
- 一个全局错误中间件:
app.use((err, req, res, next) => { ... }) - 判断
err.isOperational:- 是
true:记录日志(含时间、路径、错误码),返回{ success: false, error: { code, message } } - 是
false:立刻记录严重日志(含堆栈),并调用process.exit(1)—— 不重启就可能状态污染
- 是
- 配合 PM2 或 systemd 启动服务,确保崩溃后自动拉起
整个过程不依赖任何第三方错误库,全是原生 JS + Express 原语。关键不是“怎么写”,而是“为什么这么分”——操作错误可恢复,程序错误不可信。跑通一次,你就真正掌握了异步错误的主干逻辑。










