测试Express应用默认错误处理程序出现超时是什么原因导致的?
超时问题诱因
- 核心原因是 Express v4及更早版本原生不支持自动捕获异步路由处理函数抛出的Promise rejection异常
你写的/my-endpoint路由处理函数是async类型,当underlyingFunction抛出错误时,这个错误会转化为Promise rejected状态,但Express不会主动将这个异常传递给你注册的错误处理中间件errorHandler,请求会一直处于挂起状态,没有响应返回给测试用例里的request对象,最终触发jest的超时阈值报错。
修复方案
给异步路由加try catch捕获异常,主动调用next()将异常传递给错误处理中间件即可:
app.get('/my-endpoint', async (req, res, next) => { try { await underlyingFunction() res.send({ success: true }) } catch (err) { // 手动传递错误给错误处理中间件 next(err) } })
如果不想每个异步路由都手动加try catch,也可以封装统一的异步错误捕获工具函数,批量处理异步路由的异常传递。
内容的提问来源于stack exchange,提问作者Patrick Kayongo
相关产品推荐
相关产品推荐

