Express状态码无法设置为500的问题及Axios异常处理咨询
Express注册接口状态码问题及前后端修复方案
后端问题修复
你的后端代码存在两处导致状态码异常的问题:
用户已存在时的状态码调用顺序错误
原代码中return res.json({...}).status(500);的执行顺序逻辑错误——Express里res.json()会直接发送默认状态码为200的HTTP响应,后续的.status(500)根本不会生效。必须先设置状态码,再发送响应体:if (isUserExist) { return res.status(500).json({ message: 'User already exist', success: false }); }catch块中的响应方法使用错误
res.sendStatus(500)会直接发送状态码为500的响应,并附带默认响应文本(比如"Internal Server Error"),之后的.json(...)不会被执行。要改成先设置状态码,再返回自定义响应体:catch (error) { res.status(500).json({ message: 'Error creating user', success: false }); }
修复后的完整后端代码:
router.post('/register', async (req: Request, res: Response) => { const { password, email } = req.body; try { const isUserExist = await UserModel.findOne({ email: email }); if (isUserExist) { return res.status(500).json({ message: 'User already exist', success: false }); } const hashPassword = bcrypt.hashSync(password, 10); req.body.password = hashPassword; const newUser = new UserModel(req.body); await newUser.save(); res.json({ message: 'user created successfully', success: true }); } catch (error) { res.status(500).json({ message: 'Error creating user', success: false }); } });
前端错误处理优化
Axios的默认行为是:只要HTTP状态码≥400,就会把请求抛出到catch分支,所以后端返回500时前端进入catch是正常的。当前问题是你没有读取后端返回的错误信息,而是直接提示固定文本。
修改前端代码,从错误对象中提取后端返回的message:
export const registerUser = createAsyncThunk('post/user', async (user: RegisterFormProps) => { try { const response = await axios.post(environment.BASE_URL + '/user/register', user); console.log('suc', response.data.success); if (response.data.success) { toast.success(response.data.message); } else { toast.error(response.data.message); } } catch (error) { const err = error as AxiosError; console.log('err', err); // 优先使用后端返回的错误信息,没有的话再用默认提示 const errorMsg = err.response?.data?.message || 'something went wrong'; toast.error(errorMsg); } });
这样当后端返回500状态码时,前端会显示后端定义的具体错误信息(比如"User already exist"),而非固定提示。
内容的提问来源于stack exchange,提问作者3gwebtrain
相关产品推荐
相关产品推荐

