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

