MongoDB 连接选项错误:useCreateIndex 和 useFindAndModify 不受支持
问题描述
当使用 Mongoose 连接 MongoDB 数据库时,可能会遇到以下错误:
MongoParseError: options useCreateIndex, useFindAndModify are not supported
这个错误通常出现在以下代码中:
javascript
const URI = process.env.MONGODB_URL;
mongoose.connect(URI, {
useCreateIndex: true,
useFindAndModify: false,
useNewUrlParser: true,
useUnifiedTopology: true
}, err => {
if(err) throw err;
console.log('Connected to MongoDB!!!')
})
问题原因
这个错误是由于 Mongoose 6.0+ 版本的重大变更导致的。从 Mongoose 6.0 开始,以下几个连接选项已被弃用并不再支持:
useCreateIndex
useFindAndModify
useNewUrlParser
useUnifiedTopology
版本兼容性说明
此问题主要影响从 Mongoose 5.x 升级到 6.x 的用户。Mongoose 6.0 于 2021年8月发布,引入了这些重大变更。
解决方案
方案一:移除已弃用的选项(推荐)
最简单的解决方法是完全移除这些已不再支持的选项:
javascript
const URI = process.env.MONGODB_URL;
mongoose.connect(URI, (err) => {
if(err) throw err;
console.log('Connected to MongoDB!!!')
})
或者使用 Promise 语法:
javascript
const URI = process.env.MONGODB_URL;
mongoose.connect(URI)
.then(() => console.log('Connected to MongoDB!!!'))
.catch(err => console.error('Connection error:', err));
方案二:使用异步/await 语法
javascript
const connectDB = async () => {
try {
await mongoose.connect(process.env.MONGODB_URL);
console.log('MongoDB connected successfully');
} catch (error) {
console.error('MongoDB connection error:', error.message);
process.exit(1);
}
};
connectDB();
方案三:设置严格查询模式(可选)
虽然与连接选项无关,但 Mongoose 6 还引入了 strictQuery
选项的变化:
javascript
// 在连接前设置严格查询模式
mongoose.set("strictQuery", false);
mongoose.connect(process.env.MONGODB_URL)
.then(() => console.log('Connected to MongoDB'))
.catch(error => console.log('Connection failed:', error));
版本降级方案(不推荐)
不推荐的做法
虽然降级到 Mongoose 5.x 可以暂时解决问题,但这不是长期解决方案,因为旧版本最终会失去支持。
如果因特殊原因需要降级:
bash
# 卸载当前版本
npm uninstall mongoose
# 安装特定旧版本
npm install mongoose@5.13.8
迁移指南
从 Mongoose 5 迁移到 6 时,需要注意以下变更:
- 连接选项:移除所有已弃用的选项
- Promise 处理:连接方法不再返回 thenable,需要使用
asPromise()
方法 - 回调函数:Mongoose 6 不再支持连接回调函数
javascript
// Mongoose 5.x 语法(已过时)
mongoose.connect(uri, options, callback);
// Mongoose 6.x 语法(正确)
mongoose.connect(uri).then(() => {
// 连接成功
}).catch(error => {
// 处理错误
});
总结
MongoDB 驱动程序的不断更新导致了 API 的变化。Mongoose 6.0+ 版本已经将许多旧选项设为默认行为,因此无需显式声明它们:
useNewUrlParser
和useUnifiedTopology
现在总是启用useCreateIndex
也总是启用useFindAndModify
默认为 false
保持代码库更新并遵循最新的最佳实践是避免此类问题的最佳方法。定期查阅 Mongoose 官方迁移指南可以帮助您及时了解最新变更。