Node.js v20.7.0 环境下运行 MongoDB v6.x 驱动报 SyntaxError: Unexpected token '??=',本质是 Node.js 版本兼容性误判;真正导致连接失败的主因是 MongoDB 连接 URI 缺少端口号(默认 27017),且旧版连接选项(useNewUrlParser/useUnifiedTopology)在 v6+ 驱动中已被废弃。
mongodb 连接失败:syntaxerror 与连接 uri 配置详解
你遇到的错误看似由 ??=(空值合并赋值运算符)引发,提示 SyntaxError: Unexpected token '??=',但需明确一点:Node.js v20.7.0 完全支持 ??= 语法(该特性自 Node.js v15.0.0 起已稳定可用)。因此,此报错并非真实根源,而是错误堆栈被截断或实际运行环境与预期不符——例如进程意外降级至低版本 Node.js(如 v12/v14),或存在多版本共存、PM2/Nodemon 启动时未正确加载当前 Node 版本。
但更关键、可复现且直接影响连接的问题,在于你的 MongoDB 连接 URI 和驱动配置:
✅ 正确的连接 URI 必须显式包含端口
你当前使用:
const uri = 'mongodb://localhost/testDatabase';
这会默认尝试连接 localhost:27017,但 MongoDB 驱动 v6.x 不再隐式补全端口,尤其在某些网络配置或 Docker 环境下易解析失败。务必显式声明端口:
const uri = 'mongodb://localhost:27017/testDatabase'; // ✅ 推荐写法 // 或使用完整格式(支持 replica set、认证等扩展) // const uri = 'mongodb://localhost:27017/testDatabase?serverSelectionTimeoutMS=2000&connectTimeoutMS=2000';
⚠️ 移除已废弃的连接选项
MongoDB Node.js 驱动 v6.0+ 完全移除了 useNewUrlParser 和 useUnifiedTopology 选项。保留它们不仅无效,还可能干扰驱动内部逻辑(尽管通常静默忽略)。请直接删除:
// ❌ 错误:v6.x 不识别这些选项
const client = new MongoClient(uri, {
useNewUrlParser: true, // ← 删除
useUnifiedTopology: true, // ← 删除
});
// ✅ 正确:v6.x 默认启用统一拓扑和新解析器
const client = new MongoClient(uri);✅ 完整修复后的连接代码
const { MongoClient } = require('mongodb');
// ✅ 显式端口 + 无废弃选项
const uri = 'mongodb://localhost:27017/testDatabase';
const client = new MongoClient(uri, {
// 可选:增强健壮性(推荐生产环境添加)
serverSelectionTimeoutMS: 3000, // 连接选择超时
socketTimeoutMS: 4000, // Socket 读写超时
});
async function connectToDatabase() {
try {
await client.connect(); // ✅ v6.x 的 connect() 返回 Promise,无需 callback
console.log('✅ Connected to MongoDB database');
return client.db(); // 可直接返回 db 实例
} catch (err) {
console.error('❌ Error connecting to MongoDB:', err.message);
throw err; // 建议抛出以便上层处理
}
}
// ✅ 导出 db 实例工厂函数(避免提前调用 getDatabase)
module.exports = {
connectToDatabase,
getDatabase: () => client.db(),
};? 验证与调试建议
- 确认 MongoDB 服务正在运行:终端执行 mongosh --eval "db.runCommand({ping: 1})",应返回 { ok: 1 };
- 检查端口占用:lsof -i :27017(macOS/Linux)或 netstat -ano | findstr :27017(Windows);
-
启用驱动日志(临时排障):
const client = new MongoClient(uri, { verbose: true, loggerLevel: 'debug' }); - 验证 Node.js 实际版本:在应用启动脚本开头加入 console.log('Node version:', process.version);,排除 PM2/Nodemon 使用了旧版 Node。
? 总结:??= 报错是“假象”,根源在于连接 URI 缺失端口 + 混用过期配置。MongoDB v6.x 驱动设计更简洁,默认启用最佳实践,开发者只需提供标准 URI 并确保服务可达即可。升级驱动后,请始终查阅 官方迁移指南。


















