如何在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
相关产品推荐
相关产品推荐

