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

配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:15:35