Express中间件:添加Promise拒绝处理程序简化错误捕获
嘿,我懂你想简化这个Express中间件错误处理的需求——用async/await搭配try/catch,或者封装一个通用的错误捕获高阶函数,都是非常清爽的解决方案,能让代码更简洁易读,还能统一处理错误。
方案一:直接用async/await + try/catch改造
把你的路由处理函数改成async函数,用try包裹业务逻辑,所有Promise的错误都会被catch捕获并直接传给Express的错误处理中间件:
router.put('/', async function (req, res, next) { try { const data = req.body; const q = req.parsedFilterParam; const opts = req.parsedQueryOpts; // 用await替代Promise链式调用,同步风格更直观 const updateResult = await ResponseCtrl.update(q, data, opts); // 原代码里的stdPromiseResp(res)应该是返回一个接收结果的处理函数,所以这里把结果传进去 stdPromiseResp(res)(updateResult); } catch (err) { // 把错误交给Express的全局错误处理中间件处理 next(err); } });
这种方式把原来的Promise链式调用改成了同步风格的代码,错误捕获逻辑一目了然,适合单个路由的快速改造。
方案二:封装通用高阶函数,批量简化路由错误处理
如果你的项目里有大量类似的路由中间件,不想每个都写try/catch,可以封装一个asyncHandler高阶函数,统一处理异步错误:
// 全局定义这个错误捕获高阶函数 const asyncHandler = (handler) => (req, res, next) => { // 自动捕获async函数的Promise错误,并传给next Promise.resolve(handler(req, res, next)).catch(next); }; // 用它包裹你的路由处理函数 router.put('/', asyncHandler(async (req, res) => { const data = req.body; const q = req.parsedFilterParam; const opts = req.parsedQueryOpts; const updateResult = await ResponseCtrl.update(q, data, opts); stdPromiseResp(res)(updateResult); }));
这个asyncHandler帮你省去了重复写try/catch的麻烦,所有异步操作的错误都会被自动捕获并传递给Express的全局错误处理中间件,让你的路由代码更干净。
注意事项
要确保你的Express应用已经配置了全局错误处理中间件(一个带有4个参数的函数),比如:
app.use((err, req, res, next) => { console.error('路由错误:', err); res.status(err.statusCode || 500).json({ message: err.message || '服务器内部错误' }); });
这样next(err)传递的错误才能被正确处理并返回给客户端。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

