使用MongoDB Atlas连接字符串通过Mongoose连接时报错求助
连接MongoDB Atlas时反复遇到以下错误:
TypeError: Cannot read properties of undefined (reading 'constructor')
先后尝试了Mongoose最新版8.7.3和旧版7.6.0(此前项目可用版本),无论从.env文件读取连接字符串还是硬编码,问题都存在。负责连接的代码如下:
import dotenv from 'dotenv'; import mongoose from 'mongoose'; import variables from '../variables'; import { logger } from '../utilities'; dotenv.config(); console.log('DB_URI', process.env.DATABASE_URL); export const connect = async (): Promise<void> => { try { if (!process.env.DATABASE_URL) { throw new Error('DATABASE_URL not provided'); } await mongoose.connect("mongodb+srv://username:password@cluster0.5n5aj.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0"); console.log('DB connected successfully'); logger.info(`DB is successfully connected`); } catch (error) { console.log('DB connection error>>', error); logger.error(`DB connection error ${error}`); } }; export const disconnect = () => { if (!process.env.DATABASE_URL) { return; } mongoose.disconnect(); };
可能的解决方案:
检查Node.js版本兼容性
Mongoose 7.x要求Node.js 16.20及以上,8.x要求Node.js 18.12及以上。执行node -v查看当前版本,若低于要求,升级Node.js后再尝试连接。修复依赖损坏问题
删除项目根目录下的node_modules文件夹和package-lock.json(或yarn.lock)文件,重新执行npm install(或yarn install),确保mongoose依赖完整安装。排查第三方依赖干扰
代码中导入了variables和logger模块,临时注释掉这两个导入,只保留mongoose和dotenv的基础连接代码测试。如果能正常连接,再逐步排查这两个模块是否修改了全局变量或mongoose内部对象。规范连接字符串与选项
确保连接字符串中的用户名、密码正确(密码含特殊字符需URL编码),并显式指定要连接的数据库名称:await mongoose.connect(process.env.DATABASE_URL, { dbName: '你的目标数据库名', });也可以尝试移除连接字符串中的
appName参数,部分场景下该参数可能引发兼容性问题。验证mongoose对象完整性
在connect函数开头添加console.log('Mongoose instance:', mongoose),查看输出的mongoose对象是否包含connect等核心方法。如果对象不完整,说明依赖导入或安装存在问题。
内容的提问来源于stack exchange,提问作者danoseun

