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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:35:52