Mongoose连接MongoDB异常行为及连接监听失效问题咨询
Mongoose连接MongoDB常见问题解答
问题1:连接不存在的数据库/错误端口未触发catch是否正常?
这个行为是正常的,原因如下:
- 连接不存在的数据库:MongoDB的机制是,当你连接一个不存在的数据库时,并不会立即报错,只有当你首次向该数据库写入数据时,MongoDB才会自动创建这个数据库。因此Mongoose在连接阶段不会检测数据库是否存在,自然不会触发catch。
- 连接错误端口:Mongoose默认开启了自动重连机制,当端口错误导致连接失败时,它会不断尝试重连,而不是立即抛出错误。只有当重连多次失败或超过设定的超时时间后,才会触发错误。而协议错误(比如写成
moodb://)属于无效的连接协议,Mongoose会直接识别为错误并触发catch。
问题2:监听connected事件需在mongoose.connect()前绑定才生效是否正确?
这个操作是正确的。因为mongoose.connect()调用后,连接可能已经快速完成,此时再绑定connected事件,事件已经触发过了,监听器就无法捕获到这个事件。
Mongoose的连接事件是异步触发的,如果你在await mongoose.connect()之后再绑定监听器,此时连接可能已经完成,connected事件已经发射完毕,所以你的回调函数不会执行。正确的做法是先绑定事件监听器,再调用connect(),这样就能确保监听器能捕获到连接成功的事件。
修改后的示例代码
import express from "express"; import mongoose from "mongoose"; import { router as routes } from "./routes/index.js"; const app = express(); let database; app.use(express.json()); app.use(express.urlencoded({ extended: true })); (async () => { await connectToDB(); console.log("OK"); startServer(); })().catch(() => { console.log("error connection to db"); }); async function connectToDB() { // 先获取连接实例并绑定事件监听 database = mongoose.connection; database.on("error", (error) => { console.log("数据库连接错误:", error); }); database.once("connected", () => { console.log("Database connected"); }); // 再执行连接操作 await mongoose.connect("mongodb://127.0.0.1:27017/recipe-db"); } function startServer() { // 补充启动服务器的逻辑 app.listen(3000, () => { console.log("Server running on port 3000"); }); }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

