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

MongooseError问题:Model.findOne()不再支持回调函数

问题:MongooseError: Model.findOne() no longer accepts a callback

错误信息:
MongooseError: Model.findOne() no longer accepts a callback

错误栈:

at Function.findOne (D:\code\Project\Login-Registration\backend\node_modules\mongoose\lib\js:284:15)
at Function.process_params (D:\code\Project\Login-Registration\backend\node_modules\express\lib\router\index.js:346:12)
at next (D:\code\Project\Login-Registration\backend\node_modules\express\lib\router\index.js:280:10)
at cors (D:\code\Project\Login-Registration\backend\node_modules\cors\lib\index.js:188:7)

原代码

import express from "express"
import cors from "cors"
import mongoose from "mongoose"
import bodyParser from 'body-parser'

const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(cors())


await mongoose.connect('mongodb://127.0.0.1:27017/loginRegisterDB',{
    useNewUrlParser: true,
    useUnifiedTopology: true
},)
    .then(() => console.log( "connected"))
    .catch((err) => {console.error(err);});

const userSchema = new mongoose.Schema({
    firstName: String,
    lastName: String,
    email: String,
    password: String,
    reEnterPassword: String,
    dob: Number,
    phone: Number,
    address: String,
    pincode: Number
})

const User = new mongoose.model("User", userSchema)

app.post("/login", (req, res)=>{
    const { email, password } = req.body
    User.findOne({ email: email},(err, user) =>{
        if(user){
            if(password === user.password){
                res.send({message: "Login Successful", user: user})
            }else{
                res.send({message:"Password not match"})
            }
        }else{
            res.send({message:"User not register"})
        }
    })
})

app.post("/register", (req, res)=>{
    const { firstName, lastName, email, password, reEnterPassword, dob, phone, address, pincode } = req.body;
    User.findOne({email: email}, (err, user) => {
        if(user){
           res.send({message: "User alredy registered"})
        } else {
        const user = new User({
            firstName,
            lastName,
            email,
            password,
            reEnterPassword,
            dob, 
            phone,
            address,
            pincode
        })
        user.save(err => {
            if(err) {
                 res.send(err)
            } else{
                res.send({ message: "Successfully Registered, Login Now"})
            }

            })
        }  
    })
})

app.listen(8001,() => {
       console.log("started at port 8001")
})

解决方案

这个错误是因为新版本Mongoose已移除回调式API支持,所有查询方法(如findOne、save)仅返回Promise,需改用async/await或.then()语法处理。

修正要点

  1. 给Express路由处理函数添加async关键字,使用await替代回调
  2. 将mongoose.connect的await放到自执行async函数中(await不能直接在顶层作用域使用)
  3. 给所有异步操作添加try/catch处理异常,避免服务器崩溃

修正后的完整代码

import express from "express"
import cors from "cors"
import mongoose from "mongoose"
import bodyParser from 'body-parser'

const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(cors())

// 用自执行async函数包裹数据库连接
(async () => {
    try {
        await mongoose.connect('mongodb://127.0.0.1:27017/loginRegisterDB',{
            useNewUrlParser: true,
            useUnifiedTopology: true
        })
        console.log("connected")
    } catch (err) {
        console.error(err)
    }
})()

const userSchema = new mongoose.Schema({
    firstName: String,
    lastName: String,
    email: String,
    password: String,
    reEnterPassword: String,
    dob: Number,
    phone: Number,
    address: String,
    pincode: Number
})

const User = mongoose.model("User", userSchema)

// 登录接口改为async函数
app.post("/login", async (req, res)=>{
    try {
        const { email, password } = req.body
        const user = await User.findOne({ email: email })
        if(user){
            if(password === user.password){
                res.send({message: "Login Successful", user: user})
            }else{
                res.send({message:"Password not match"})
            }
        }else{
            res.send({message:"User not register"})
        }
    } catch (err) {
        res.status(500).send({message: "Server error", error: err.message})
    }
})

// 注册接口改为async函数
app.post("/register", async (req, res)=>{
    try {
        const { firstName, lastName, email, password, reEnterPassword, dob, phone, address, pincode } = req.body;
        const existingUser = await User.findOne({email: email})
        if(existingUser){
           res.send({message: "User already registered"})
        } else {
            const user = new User({
                firstName,
                lastName,
                email,
                password,
                reEnterPassword,
                dob, 
                phone,
                address,
                pincode
            })
            await user.save()
            res.send({ message: "Successfully Registered, Login Now"})
        }  
    } catch (err) {
        res.status(500).send({message: "Server error", error: err.message})
    }
})

app.listen(8001,() => {
       console.log("started at port 8001")
})

额外优化建议

  • 不要明文存储密码,使用bcrypt等库对密码哈希后再存储
  • 给Schema字段添加验证规则(如email唯一性、必填项限制)
  • 统一错误返回格式,使用标准HTTP状态码

内容的提问来源于stack exchange,提问作者Rush Code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:51