如何在Mongoose中关闭strictPopulate?添加配置后仍报错如何解决?
报错说明
Mongoose 6及以上版本默认开启strictPopulate校验规则,不允许populate未在Schema中显式定义的字段,就会抛出你遇到的报错:
Cannot populate path 'example' because it is not in your schema. Set the 'strictPopulate' option to false to override.
配置不生效常见排查项
如果你已经加了配置仍报错,先核对以下几点:
- 确认Mongoose版本 >= 6.0,
strictPopulate是6.0版本才新增的配置,低版本不识别该参数 - Schema级配置确认是加在对应查询Model的Schema配置项中,没有错加给其他Schema
- 查询级配置确认是加在
populate方法的参数内,不是加在find/findOne等查询方法的配置项中
正确配置方式
按生效范围从大到小有三种配置方式,任选其一即可:
1. 全局关闭(所有查询生效)
在初始化Mongoose连接时设置全局规则:
const mongoose = require('mongoose'); // 全局关闭strictPopulate校验 mongoose.set('strictPopulate', false);
2. 单个Schema关闭(仅对应Model的查询生效)
在Schema定义的第二个配置参数中添加:
const yourSchema = new mongoose.Schema({ // 你的Schema字段定义 name: String, // ... }, { strictPopulate: false // 仅该Schema对应的Model关闭校验 });
3. 单条查询关闭(仅当前查询生效)
在对应populate方法的配置中添加,优先级最高:
// 写法1:路径+配置参数分开传 const res = await YourModel.find().populate('example', { strictPopulate: false }); // 写法2:统一传populate配置对象 const res = await YourModel.find().populate({ path: 'example', strictPopulate: false, // 其他populate配置,比如select、match等 });
内容的提问来源于stack exchange,提问作者illiteratewriter
相关产品推荐
相关产品推荐

