调用Axios发送post请求后封装的saveFormData函数返回null该如何解决?
问题原因
- 直接原因:
saveFormData作为async函数未显式返回异步调用结果,async函数无return语句时默认返回undefined,导致外部调用拿到的返回值为空。 - 冗余问题:代码同时混用
await、.then()、.catch()三种异步处理逻辑,且你配置了validateStatus: () => true,所有HTTP状态码都不会触发axios的catch分支,现有catch逻辑完全无效。 - 后端隐患(不影响本次返回值问题,但存在逻辑漏洞):后端代码中查询用户失败的错误分支未加
return,错误触发后还会继续执行后续逻辑,可能导致重复返回响应报错。
解决方案
前端代码修复(二选一即可)
写法1:保留现有写法,仅添加return语句
const saveFormData = async () => { // 开头添加return,将整个异步调用的结果返回 return await axios({ method: 'post', url: 'http://localhost:7000/userInfo/registerOnline', data: registerData, validateStatus: (status) => { return true; }, }) .catch((error) => { console.log(error); return error }) .then((response) => { console.log(response); return response; }); };
写法2:简化为纯async/await写法(推荐)
去掉冗余的回调逻辑,异常统一交给外部try/catch处理,代码更易维护:
const saveFormData = async () => { const response = await axios({ method: 'post', url: 'http://localhost:7000/userInfo/registerOnline', data: registerData }) console.log(response) // 直接返回接口数据,外部可直接拿到用户信息 return response.data }
如果需要保留所有状态码都不默认抛出异常的逻辑,可自行判断状态码主动抛出错误:
const saveFormData = async () => { const response = await axios({ method: 'post', url: 'http://localhost:7000/userInfo/registerOnline', data: registerData, validateStatus: () => true }) console.log(response) if (response.status >= 400) { throw new Error(response.data.message || '注册请求失败') } return response.data }
后端代码优化(可选,修复逻辑漏洞)
给查询错误的分支添加return,避免重复响应:
exports.registerOnlineUser = (req, res) => { User.findOne({ email: req.body.email }).exec((error, user) => { if (error) { // 添加return终止后续逻辑 return res.status(400).json({ message: error }); } // 剩余原有代码不变 if (user) { return res.status(400).json({ message: 'User exists already', }); } const { fullName, email, address, cardName, cardNo, expDate, cvv } = req.body; const userCategory = 'Online'; const newUser = new User({ fullName, email, address, cardName, cardNo, expDate, cvv, userCategory, }); newUser.save((error, data) => { if (error) { return res.status(400).json({ message: error, }); } if (data) { return res.status(201).json({ user: data, }); } }); }); };
内容的提问来源于stack exchange,提问作者Tharindu Gimras
相关产品推荐
相关产品推荐

