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

连接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:01:03