MERN Stack React Native更新FCMToken接口报400错误求助
MERN React Native项目FCMToken更新400错误排查
Postman测试后端接口正常,但前端调用返回[AxiosError: Request failed with status code 400],后端通过User.findByIdAndUpdate根据req.params.id更新用户fcmToken,前端在useEffect中延迟调用action从AsyncStorage取数据发送请求。
后端代码
exports.updateFCMToken = (req, res) => { try { User.findByIdAndUpdate( req.params.id, { $set: { fcmToken: req.body.fcmToken } }, (err, doc) => { if (err) { console.log(err); res.status(400).send('update FCMToken - Error') } return res.status(200).send('FCMToken Updated Successfully') } ) } catch (err) { console.log(err); res.status(400).send('server Error - FCMToken') } }
前端代码
组件调用
useEffect(() => { setTimeout(async () => { dispatch(updateFCMTokenAction()); }, 1000); }, [])
Action函数
export const updateFCMTokenAction = () => { return async (dispatch) => { try { dispatch({ type: userConstants.UPDATE_FCMTOKEN_REQUEST }); getToken(); const fcmToken = await AsyncStorage.getItem('fcmToken'); const user = await AsyncStorage.getItem('user'); const pushToken = {fcmToken}; const id = JSON.parse(user)._id; const res = await axiosInstance.post(`/updatefcmtoken/${id}`, pushToken); dispatch({ type: userConstants.UPDATE_FCMTOKEN_SUCCESS, payload: res.data }); } catch (err) { console.log('push-err: ', err) dispatch({ type: userConstants.UPDATE_FCMTOKEN_FAILURE, payload: err }); } } }
排查方向
- AsyncStorage数据有效性:前端从AsyncStorage取的
fcmToken或user可能为空/格式错误。比如user未正确存储成JSON,JSON.parse(user)会抛错;或者getToken()是异步函数未加await,导致还没写入token就执行getItem。- 验证:在action里打印
fcmToken和user的值,确认数据存在且格式正确;若getToken()是异步,改为await getToken()。
- 验证:在action里打印
- 请求参数解析问题:检查后端是否配置了
express.json()或body-parser,否则req.body会是空对象,导致更新失败触发400。同时对比Postman请求体格式和前端发送的是否一致。 - 用户ID正确性:
JSON.parse(user)._id是否为合法的MongoDB ObjectId?若ID格式错误(长度不符、字符非法),findByIdAndUpdate会报错返回400。 - Axios实例配置:
axiosInstance是否设置了正确的baseURL、请求头?比如后端接口需要Authorization token,Postman手动添加但前端未携带,导致接口拒绝。 - 后端错误日志:查看后端控制台打印的
err内容,明确是findByIdAndUpdate的查询错误还是其他异常,精准定位问题。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

