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

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()。
  • 请求参数解析问题:检查后端是否配置了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:05:22