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

MERN栈拼接用户ID到Axios请求URL获取聊天记录时遇500错误

解决对话卡片组件Axios请求500错误及获取双方用户数据问题

核心问题定位

  • 请求URL格式错误:前端拼接URL时错误地将登录用户ID与好友ID用=连接,传入后端/api/user/find/:id接口后,后端收到的id是两个ID拼接的无效值(如user123=friend456),User.findById()无法识别该ID,抛出错误返回500。
    错误代码片段:

    const res = await axios(
        `${BASE_API_URL}/api/user/find/${userId.user._id}=` + friendId,
        { headers: { Authorization: `Bearer ${token}` } }
    );
    
  • 后端接口不支持批量查询:当前后端/find/:id仅能查询单个用户,无法满足你同时获取登录用户与好友双方数据的需求。

解决方案

方案一:前端分两次请求获取数据(无需修改后端)

分别请求登录用户和好友的信息,再合并数据:

const getUser = async () => {
    try {
        // 获取登录用户信息
        const loggedUserRes = await axios(
            `${BASE_API_URL}/api/user/find/${userId.user._id}`,
            { headers: { Authorization: `Bearer ${token}` } }
        );
        // 获取好友信息
        const friendRes = await axios(
            `${BASE_API_URL}/api/user/find/${friendId}`,
            { headers: { Authorization: `Bearer ${token}` } }
        );
        // 存储双方数据
        setLoggedUserId({
            loggedUser: loggedUserRes.data[0],
            friendUser: friendRes.data[0]
        });
    } catch (error) {
        console.log(error);
    }
};

方案二:新增后端批量查询接口(更高效)

在后端新增支持多ID查询的接口,一次性获取双方数据:

// 后端新增批量查询接口
router.get("/find-multiple", verifyToken, async (req, res) => {
    try {
        const { ids } = req.query;
        if (!ids) return res.status(400).json("请提供用户ID列表");
        const userIds = ids.split(",");
        const users = await User.find({ _id: { $in: userIds } });
        res.status(200).json(users);
    } catch (err) {
        res.status(500).json(err);
    }
});

前端调用该接口:

const getUser = async () => {
    try {
        const res = await axios(
            `${BASE_API_URL}/api/user/find-multiple?ids=${userId.user._id},${friendId}`,
            { headers: { Authorization: `Bearer ${token}` } }
        );
        console.log(res.data, "双方用户数据");
        setLoggedUserId(res.data);
    } catch (error) {
        console.log(error);
    }
};

额外优化点

  • 给对话接口添加权限验证:当前获取对话的接口未加verifyToken中间件,存在安全风险,建议补充:
    router.get('/:userId', verifyToken, async (req, res) => {
        // ...原有逻辑
    })
    
  • 前端增加空值判断:获取friendId时添加判断,避免空值导致请求错误:
    const friendId = conversation.members.find(
        (member) => member !== currentUser._id
    );
    if (!friendId) return; // 未找到好友ID时终止请求
    

内容的提问来源于stack exchange,提问作者Joshua Ndeleva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:29