配置MongoDB Schema后无法使用User.findOne()查询数据求助
Mongoose Schema配置后查询返回null的排查与解决
问题概述
使用原生MongoDB驱动时,以下查询语句可成功获取数据:
const uri = process.env.MONGODB_URI; const client = new MongoClient(uri); const result = await client.db("inride_adverts").collection("adverts").findOne({OrgEmail: OrgEmailToSignIn});
但配置Mongoose的User Schema后,调用User.findOne( {OrgEmail: signUpEmail} ).exec()始终返回null,同时代码执行进入catch块输出"Error logging in"。
相关代码
./models/User.js
import { mongoose} from 'mongoose'; const UserSchema = new mongoose.Schema({ OrgName: { type: String, required: true }, OrgEmail: { type: String, required: true }, OrgPwd: { type: String, required: true } }, { collection: 'adverts' }); export const User = mongoose.model('User', UserSchema);
./server.js关键代码
import express from 'express'; import { User } from './models/User.js'; import mongodb from 'mongodb'; import { mongoose} from 'mongoose'; mongoose.connect(db, { useNewUrlParser: true }) mongoose.connect(db, { useNewUrlParser: true }) .then( () => console.log("MongoDB Connected...")) .catch(error => console.log(err)) app.route('/advertiserRegister') .post( async (req, res) => { let formData = req.body; let signUpName = formData.signUpName; let signUpEmail = formData.signUpEmail; let signUpPwd = formData.signUpPwd; console.log("signUpName: " +signUpName); console.log("signUpEmail: " +signUpEmail); console.log("signUpPwd: " +signUpPwd); if(signUpPwd !== signUpPwdConfirm){ console.log("Passwords arent EQUAL!"); return 0; } else { try{ console.log("signUpEmail>>> : " + signUpEmail ); const testing = await User.findOne( {OrgEmail: signUpEmail} ).exec(); console.log("testing >>> : " ,testing ); res.redirect('/advertiserLogin') } catch { console.log("Error logging in "); res.redirect('/advertiserRegister') }; } });
运行日志
MongoDB Connected... signUpName: Merc Enterprise LTD signUpEmail: hundredcent.a@gmail.com signUpPwd: 555 signUpEmail>>> : hundredcent.a@gmail.com testing >>> : null Error logging in
排查思路与解决方案
1. 修复未定义变量错误
代码中signUpPwdConfirm变量未从req.body中获取就进行比较,会直接抛出ReferenceError,导致进入catch块,这是日志中输出"Error logging in"的直接原因。
修复方式:
// 在post请求处理中添加变量获取 let signUpPwdConfirm = formData.signUpPwdConfirm;
2. 确认Mongoose连接的目标数据库
原生驱动明确指定了数据库inride_adverts,需确保Mongoose连接的是同一个数据库:
- 检查
db变量的连接字符串,确认包含数据库名,例如:mongodb+srv://<user>:<pass>@cluster0.mongodb.net/inride_adverts - 或在连接后显式指定数据库:
mongoose.connect(db, { useNewUrlParser: true }) .then(() => { console.log("MongoDB Connected..."); mongoose.connection.useDb('inride_adverts'); // 指定数据库 }) .catch(err => console.log(err))
3. 验证字段匹配与数据类型
MongoDB字段名区分大小写,且数据类型严格匹配:
- 在MongoDB Shell或Compass中执行
db.adverts.findOne({OrgEmail: "hundredcent.a@gmail.com"}),确认是否能查到数据 - 检查数据库中
OrgEmail字段的大小写是否与Schema完全一致(例如是否为orgemail小写) - 确认数据库中该字段的值为字符串类型,而非其他类型
4. 移除重复的数据库连接调用
server.js中两次调用mongoose.connect(db),保留一次即可避免连接冲突:
// 保留一次连接 mongoose.connect(db, { useNewUrlParser: true }) .then( () => console.log("MongoDB Connected...")) .catch(err => console.log(err))
5. 完善错误捕获
修改catch块捕获错误对象,便于排查具体问题:
catch (err) { console.log("Error details: ", err); // 输出具体错误信息 res.redirect('/advertiserRegister') }
内容的提问来源于stack exchange,提问作者SirBT
相关产品推荐
相关产品推荐

