Mongoose调用populate报is not a function错误解决求助
问题分析与修复方案
报错产生原因
- 核心原因是Mongoose版本不兼容:你使用的是Mongoose 6.0及以上版本,该版本对文档实例的
populate方法做了破坏性更新:单文档实例调用populate时直接返回Promise,不再支持链式调用多个populate方法,也不再需要调用execPopulate()执行填充逻辑。你代码中的链式调用写法是Mongoose 5.x及更早版本的语法,在新版本中无法识别,因此抛出populate is not a function的类型错误。
修复方法
方法1:使用单populate传入数组配置(推荐,适配Mongoose 6+版本)
将链式调用的多个populate合并为单次调用,传入包含所有填充规则的数组,直接await即可,无需调用execPopulate:
const Registration = require('../models/Registration'); module.exports = { async create(request, response) { const { user_id } = request.headers; const { eventId } = request.params; const { date } = request.body; const registration = await Registration.create({ user: user_id, event: eventId, date }); // 替换原有链式populate代码 await registration.populate([ { path: 'event' }, { path: 'user', select: '-password' } ]); return response.json(registration); } }
方法2:使用模型静态populate方法
也可以调用Registration模型的静态populate方法,传入要填充的文档实例和填充规则:
const populatedRegistration = await Registration.populate(registration, [ { path: 'event' }, { path: 'user', select: '-password' } ]); return response.json(populatedRegistration);
降级兼容方案(不推荐)
如果项目其他逻辑依赖Mongoose 5.x的语法,可以将Mongoose版本降级到5.x最后稳定版:npm install mongoose@5.13.20
内容的提问来源于stack exchange,提问作者user17580755
相关产品推荐
相关产品推荐

