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

如何用Throw函数抛出带400状态码的自定义错误并在Postman中生效

用Throw抛出带指定状态码的自定义错误解决方案

核心问题是原生Error对象不包含状态码属性,Express的默认错误处理会把所有未处理的错误统一返回500状态码。要实现抛出带指定状态码的自定义错误,需要自定义错误类+全局错误处理中间件配合使用,具体步骤如下:

1. 定义自定义错误类

继承原生Error,扩展出statusCode属性来存储期望的状态码:

class CustomError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
    // 修复原型链,确保instanceof判断正常
    Object.setPrototypeOf(this, CustomError.prototype);
  }
}

2. 在业务逻辑中抛出自定义错误

替换原生throw new Error(),改用自定义的CustomError:

// 示例:用户不存在时抛出400错误
if (!user) {
  throw new CustomError("User not found", 400);
}

3. 注册全局错误处理中间件

这个中间件必须放在所有路由和其他中间件之后,用来捕获并处理所有抛出的错误:

app.use((err, req, res, next) => {
  // 优先使用自定义错误的状态码,默认 fallback 到500
  const statusCode = err.statusCode || 500;
  const message = err.message || "Internal Server Error";

  res.status(statusCode).json({
    status: false,
    message: message
  });
});

注意事项

  • 异步路由处理:如果在async函数中抛出错误,需要手动用try/catch捕获并通过next(err)传给全局中间件,或者安装express-async-errors包自动处理异步错误,避免错误被吞噬:
    // 方式1:手动try/catch
    app.get('/user/:id', async (req, res, next) => {
      try {
        const user = await User.findById(req.params.id);
        if (!user) throw new CustomError("User not found", 400);
        res.json(user);
      } catch (err) {
        next(err);
      }
    });
    
    // 方式2:使用express-async-errors自动处理
    require('express-async-errors');
    app.get('/user/:id', async (req, res) => {
      const user = await User.findById(req.params.id);
      if (!user) throw new CustomError("User not found", 400);
      res.json(user);
    });
    
  • 中间件顺序:全局错误处理中间件一定要放在所有路由和其他中间件的最后,否则无法捕获后续路由抛出的错误。

如果之前按照其他方案操作失败,大概率是以下原因:

  • 自定义错误类未正确维护原型链,导致err.statusCode无法被识别
  • 全局错误处理中间件的位置不对,没有捕获到错误
  • 异步函数中的错误未正确传递给全局中间件

内容的提问来源于stack exchange,提问作者Pankaj Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:20:52