使用Node.js从MongoDB按邮箱删除/获取用户失败求助
问题分析与解决
核心原因:URL编码未解码
邮箱里的@、.等特殊字符在URL中会被自动编码(比如@转成%40),你直接用req.params.id去匹配数据库里的原始邮箱字符串,自然找不到对应数据。静态值能成功是因为你直接用了未编码的邮箱。
解决方案
1. 对URL参数进行解码
用decodeURIComponent()处理req.params.id,还原真实的邮箱字符串:
修正后的删除接口代码
router.delete("/:id", async(req, res) => { try{ // 解码URL参数里的邮箱 const decodedEmail = decodeURIComponent(req.params.id); console.log(decodedEmail); const result = await User.deleteOne({email: decodedEmail}); // 检查是否真的删除了文档 if(result.deletedCount === 0) { return res.status(404).json("User not found!"); } res.status(200).json("User has been deleted..."); }catch(err){ res.status(500).json(err.message); } });
修正后的查询接口代码
router.get("/:id", async(req, res) => { try{ const decodedEmail = decodeURIComponent(req.params.id); console.log(decodedEmail); // 用findOne代替find,因为邮箱是唯一标识,直接返回单个文档 const user = await User.findOne({email: decodedEmail}); if(!user) { return res.status(404).json("User not found!"); } res.status(200).json(user); } catch(err){ res.status(500).json(err.message); } });
额外排查点
- 检查请求URL:确认前端传入的编码后邮箱是否正确,比如
sita@gmail.com对应的URL应该是/api/users/sita%40gmail.com - 数据库校验:确认数据库中存储的邮箱没有多余空格或大小写差异(比如你用静态值
sita@gmail.com能找到,那变量解码后要和这个完全一致)
内容的提问来源于stack exchange,提问作者GAURI WALKE
相关产品推荐
相关产品推荐

