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
相关产品推荐
相关产品推荐

