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

如何在Express中返回可被调用方捕获的错误响应?

问题解决:Express返回错误并让fetch正确捕获

核心原因说明

fetch API 仅在网络层面出错(如请求无法发送、连接中断)时才会触发.catch()。对于HTTP 4xx/5xx这类状态码的响应,fetch会判定请求“成功”,直接进入.then()回调,这是你当前代码的关键问题。

1. Express端的正确错误返回方式

推荐返回结构化JSON格式的错误信息,既规范又方便前端解析:

router.post('/createUser', cors() as RequestHandler, async (req, res, next) => {
  // 返回带状态的结构化错误
  return res.status(400).json({
    success: false,
    message: 'Something went wrong'
  });
});

如果需要传递Error对象的信息,手动提取关键属性即可:

router.post('/createUser', cors() as RequestHandler, async (req, res, next) => {
  try {
    // 业务逻辑示例
    throw new Error('Invalid user data');
  } catch (err) {
    return res.status(400).json({
      success: false,
      message: err.message
    });
  }
});

2. 前端fetch的错误处理调整

要让HTTP错误进入.catch(),需要在.then()中主动判断响应状态,手动抛出错误:

fetch(`${url}/createUser`, {
  method: 'POST', // 注意:POST接口必须指定请求方法
  headers: {
    'Content-Type': 'application/json'
  }
  // 如有请求体,添加 body: JSON.stringify(yourData)
})
.then(res => {
  // 状态码不在200-299范围时,判定为错误
  if (!res.ok) {
    return res.json().then(errData => {
      throw new Error(errData.message || 'Request failed');
    });
  }
  return res.json();
})
.then(data => {
  // 处理成功响应
})
.catch(e => {
  // 此处会捕获HTTP错误和网络错误
  console.error(e.message);
});

你之前尝试的问题解析

  • res.status(400).send('Something went wrong')返回HTML:Express默认会将字符串响应的Content-Type设为text/html,如果要返回JSON,需手动设置头或直接用res.json()方法。
  • res.status(400).send(new Error('Something went wrong'))返回{}:Error对象的可枚举属性极少,Express序列化时无法提取有效信息,必须手动取出message等属性返回。

内容的提问来源于stack exchange,提问作者Gergő Horváth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:03:25