Skip to content

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 时,需要注意以下变更:

  1. 连接选项:移除所有已弃用的选项
  2. Promise 处理:连接方法不再返回 thenable,需要使用 asPromise() 方法
  3. 回调函数: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+ 版本已经将许多旧选项设为默认行为,因此无需显式声明它们:

  • useNewUrlParseruseUnifiedTopology 现在总是启用
  • useCreateIndex 也总是启用
  • useFindAndModify 默认为 false

保持代码库更新并遵循最新的最佳实践是避免此类问题的最佳方法。定期查阅 Mongoose 官方迁移指南可以帮助您及时了解最新变更。