mongoose中collection.find()方法抛出“最多接受两个参数”错误的问题咨询
问题原因与解决办法
错误原因
这个MongoInvalidArgumentError本质是Mongoose和底层MongoDB Node.js驱动的版本不兼容导致的。
最近MongoDB驱动(mongodb包)更新到4.x+版本后,对collection.find()的参数规则做了严格限制:最多只接受2个参数(查询条件、选项)。但旧版本的Mongoose在调用驱动的find方法时,可能会额外传递第三个内部参数,这就触发了驱动的参数校验错误。
你说之前代码能正常运行,大概率是刚才无意中更新了依赖(比如执行了npm update,或者安装其他包时间接升级了mongodb驱动),导致原本兼容的版本组合被打破了。
解决办法
1. 对齐Mongoose与MongoDB驱动版本
这是最根本的解决方式:
- 先查看当前依赖版本:
npm list mongoose mongodb - 按照Mongoose官方的兼容表调整版本:
- Mongoose 6.x ↔ MongoDB驱动4.x
- Mongoose 7.x ↔ MongoDB驱动5.x
- Mongoose 8.x ↔ MongoDB驱动6.x
- 执行安装命令修正版本,比如升级Mongoose到最新兼容版:
或者指定稳定兼容版本:npm install mongoose@latestnpm install mongoose@6.12.0
2. 临时兼容写法(不升级版本的情况下)
如果暂时不想调整依赖版本,可以给find方法明确传递第二个空选项参数,让调用符合驱动的参数要求:
const res = await roomModel.find({ 'roomname': 'room1' }, {});
另外,如果你的场景只需要查询单个文档,改用findOne会更合适,也能避开这个问题:
const res = await roomModel.findOne({ 'roomname': 'room1' });
3. 清理依赖缓存(如果版本对齐后仍有问题)
有时候缓存的依赖会导致版本异常,执行以下步骤重置依赖:
rm -rf node_modules package-lock.json npm install
内容的提问来源于stack exchange,提问作者Santosh Jugjali
相关产品推荐
相关产品推荐

