连接MongoDB Atlas时遇Cannot read properties of undefined (reading 'on')错误求助
问题分析与解决
核心错误原因
你的代码里存在一个直接导致报错的语法问题:mongoose.connection之后调用了console.log(mongoose.connect),这一行会返回undefined,使得后续的.on()、.once()方法调用在undefined对象上,从而抛出Cannot read properties of undefined (reading 'on')错误。
此外还有两处逻辑问题:
cachedMongoConn存储的是mongoose.connect返回的Promise,而非实际的数据库连接实例,不符合缓存连接的设计逻辑- Mongoose 6.x及以上版本已默认启用
useNewUrlParser、useUnifiedTopology配置,无需手动声明
修正后的代码
import mongoose from "mongoose"; import dotenv from "dotenv"; mongoose.set("strictQuery", false); dotenv.config(); let connection_uri = process.env.MONGODB_URI; let cachedMongoConn = null; export const connectToDatabase = async () => { // 存在缓存连接时直接返回 if (cachedMongoConn) { console.log("MongoDB: using cached database instance"); return cachedMongoConn; } try { // 建立新连接 const conn = await mongoose.connect(connection_uri, { connectTimeoutMS: 60000, bufferCommands: false, }); // 缓存实际连接实例 cachedMongoConn = conn.connection; // 绑定连接事件监听 cachedMongoConn .on("error", (error) => { console.log("Error: connection to DB failed"); throw error; }) .on("close", () => { console.log("Error: Connection to DB lost"); process.exit(1); }); console.log(`Connected to ${conn.connection.host}:${conn.connection.port}/${conn.connection.name}`); return cachedMongoConn; } catch (error) { console.error("Database connection failed:", error); process.exit(1); } };
关键修改点
- 移除打断链式调用的
console.log(mongoose.connect)语句 - 改用
async/await替代Promise回调,简化代码结构 - 修正缓存逻辑,存储实际的数据库连接实例而非Promise对象
- 移除Mongoose新版本中已默认启用的冗余配置项
- 调整事件监听绑定时机,确保绑定到有效连接实例上
内容的提问来源于stack exchange,提问作者MaxxABillion
相关产品推荐
相关产品推荐

