NodeJS+Express路由中抛出的Error消息在响应res中的位置
Express路由抛出Error后,错误消息在响应中的位置
首先得明确:Express的默认错误处理行为在开发环境和生产环境完全不同,而且你当前的测试代码有个小问题——抛出500错误时,请求会进入catch分支而非then,所以你在then里打印的res其实拿不到错误响应。
1. 开发环境(默认状态,NODE_ENV未设为production)
Express默认会返回包含详细错误信息的响应,你要找的错误消息在err.response.body.error.message里。
修正你的测试代码后就能看到:
test("Error", async () => { try { await supertest(app).get("/"); } catch (err) { // 打印完整的错误响应结构 console.log(err.response.body); // 直接获取错误消息 console.log(err.response.body.error.message); expect(err.response.body.error.message).toBe("TESTING WHERE MY ERROR MESSAGE GOES IN MY RESPONSE..."); } });
此时响应的JSON体里会包含error对象,除了message,还有stack调用栈信息,方便开发调试。
2. 生产环境(NODE_ENV=production)
为了安全,Express默认会隐藏具体错误信息,响应里只会返回通用的"Internal Server Error",你看不到自定义的错误消息。
如果想在生产环境返回指定错误内容,需要自己写自定义错误处理中间件,比如:
// 在所有路由之后添加 app.use((err, req, res, next) => { res.status(err.statusCode || 500).json({ message: process.env.NODE_ENV === 'production' ? '服务器内部错误' : err.message }); });
这样就能控制生产环境下返回的错误内容。
关键提醒
- 只有当错误被Express的错误处理流程捕获时,才会生成对应的响应。路由里抛出的Error必须被传递给
next(),或者直接抛出(Express会自动捕获并交给错误处理中间件)。 - Supertest中,5xx或4xx的错误响应不会进入
then,必须用catch或者try/catch来捕获。
内容的提问来源于stack exchange,提问作者Edvaldo Silva de Almeida Jr
相关产品推荐
相关产品推荐

