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

Mongoose的findOne()方法持续返回null,但MongoDB中存在对应数据

登录时Mongoose findOne返回null的排查与解决方法

以下是针对你遇到问题的具体排查方向和解决方案:

1. 检查用户名大小写匹配问题

MongoDB的查询是大小写敏感的,如果注册时存储的用户名是Admin,但登录时传入的是admin,就会查询不到结果。

  • 解决办法:统一用户名的大小写格式,比如注册时将用户名转为小写存储,登录时也转小写查询:
    // 注册时处理
    const newUser = new User({
      username: req.body.username.toLowerCase(),
      password: hashSync(req.body.password, 10)
    });
    // 登录时查询
    const user = await User.findOne({username: req.body.username.toLowerCase()});
    

2. 确认请求体参数是否正确接收

登录接口可能没有正确获取到req.body.username,比如前端传参的字段名是userName而非username,或者没有配置express.json()中间件解析请求体。

  • 解决办法:
    • 在接口开头添加日志打印,确认实际收到的参数:
      app.post('/login', async (req, res)=>{
          console.log("接收的请求体:", req.body); // 检查username字段是否存在
          // 后续代码...
      })
      
    • 确保在Express中配置了JSON解析中间件:
      app.use(express.json());
      

3. 验证数据库中用户数据的存储状态

直接登录MongoDB Atlas控制台,查看对应集合(Mongoose默认将User模型转为复数小写的users集合),确认注册的用户确实存在,且username字段值与登录时传入的完全一致。

4. 规范异步代码写法

你的代码同时混用了await和.then(),虽然语法合法,但不利于排查错误,建议统一使用try/catch捕获异常:

app.post('/login', async (req, res)=>{
    try {
        const user = await User.findOne({username: req.body.username});
        if(!user){
            console.log(user)
            return res.status(401).send({
                success:false,
                message: "找不到用户"
            })
        }
        if(!compareSync(req.body.password, user.password)){
            return res.status(401).send({
                success:false,
                message: "密码错误"
            })
        }

        const payload = {
            username : user.username,
            id: user._id
        }
       const token = jwt.sign(payload, "Ano String", {expiresIn: "1d"}) 

       return res.status(200).send({
        success:true,
        message: "登录成功",
        token : "Bearer " + token
    })
    } catch(error) {
        console.error("查询出错:", error);
        return res.status(500).send({success: false, message: "服务器内部错误"});
    }
})

5. 确认集合名称匹配

Mongoose默认会将模型名转为复数小写作为集合名,如果注册代码手动指定了其他集合名,查询时需要保持一致。可以在定义模型时显式指定集合名:

const User = mongoose.model('User', userSchema, 'custom-collection-name');

内容的提问来源于stack exchange,提问作者Deepak Parihar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:13