Node.js驱动v6要求≥v16.20.1,弃用回调式connect(),必须await client.connect();移除useUnifiedTopology、useNewUrlParser等选项;collStats等命令已删除,需改用聚合管道;未显式close()会导致连接异常。

必须重写连接逻辑、清理废弃参数、升级 Node.js 运行时,否则 MongoClient.connect() 会静默失败或抛 TypeError: Cannot read property 'then' of undefined。
Node.js 版本和连接方式不兼容
驱动 v6 要求 Node.js ≥ v16.20.1,且彻底移除了回调式 connect() 调用。v4 的写法在 v6 下无法工作,不是“警告”,而是直接中断流程。
- ❌ 错误示例(v4 风格):
client.connect((err, client) => { ... })—— v6 中connect()返回 Promise,不接受回调 - ✅ 正确写法(v6 推荐):
await client.connect()或client.connect().then(...) - ⚠️ 若仍用
require('mongodb')+new MongoClient(...),但没 await/connect,后续db.collection().find()会报Topology is closed
必须删除或替换的废弃配置项
v6 删除了大量 v4/v5 中已标记为 deprecated 的选项,保留它们不会报错,但可能被忽略、触发意外行为,或导致连接池异常。
- ❌
useUnifiedTopology: false或useNewUrlParser: true—— v6 强制启用 unified topology,传入即无效,还可能干扰拓扑发现 - ❌
keepAlive和keepAliveInitialDelay—— 已硬编码为true和300000,显式设置会覆盖默认语义 - ❌
sslCAFile,sslCertKeyFile等以ssl开头的选项 —— 改用tlsCAFile,tlsCertificateKeyFile,或构造SecureContext - ✅ 建议只保留必要项:
serverSelectionTimeoutMS,maxPoolSize,minPoolSize,maxIdleTimeMS
collStats、addUser 等辅助方法已移除
这些不是“不推荐使用”,而是从 v6 代码中物理删除。调用会直接抛 TypeError 或 Method not found。
- ❌
db.command({ collStats: 'users' })—— 不再支持,改用聚合管道:collection.aggregate([ { $collStats: { storageStats: {} } } ]) - ❌
db.addUser()—— 已删,必须改用 MongoDB Shell 的createUser命令或通过adminCommand手动调用createUser - ❌
Db.command()传入与命令无关的选项(如readPreference)—— v6 严格校验,会报Unrecognized option
升级后 mongos 连接变脆?大概率是残留旧连接未释放
驱动 v6 对连接生命周期更严格,若应用未显式 client.close() 就重启,旧连接仍挂在 mongos 上;新版 mongos(5.0+)会主动 reset 这类“非标准”连接,表现为 Socket recv() errno:54 Connection reset by peer 或频繁 MongoServerSelectionError。
- 务必在进程退出前调用
client.close()(配合process.on('SIGINT', ...)) - 检查是否有多个
new MongoClient()实例未复用 —— v6 默认共享连接池,重复实例会导致连接数失控 - 若用 PM2/Supervisor,确保 graceful shutdown 配置生效,否则
close()可能来不及执行
最易被忽略的是:v6 不再容忍“连上就用”的懒加载习惯。所有操作前必须确认 client.topology?.connected === true,尤其在长周期服务中,网络抖动后连接可能已断开但 client 实例仍存活。



















