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()语法处理。
修正要点
- 给Express路由处理函数添加
async关键字,使用await替代回调 - 将
mongoose.connect的await放到自执行async函数中(await不能直接在顶层作用域使用) - 给所有异步操作添加
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
相关产品推荐
相关产品推荐

