You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:55:30