migrate-mongo执行down迁移报错:无法读取undefined的drop属性
报错诱因
触发Cannot read property 'drop' of undefined的核心原因有两个:
- migrate-mongo 传入迁移脚本的
db是MongoDB原生驱动实例,原生驱动不会把库下的集合、视图自动挂载为db对象的属性,因此你写的db.content本身就是undefined,对undefined调用drop()方法直接触发类型错误。 - 你在
up方法中调用异步方法db.createCollection时没有加await,迁移工具不会等待视图创建完成就标记迁移成功,很容易出现迁移记录和实际库结构不一致的问题。
修复方案
调整迁移脚本写法,所有异步操作前加await,统一通过db.collection(集合名)的标准API获取集合/视图实例再执行操作,修正后的代码如下:
module.exports = { async up(db, client) { // 替换为你实际的聚合管道逻辑,必须添加await等待执行完成 await db.createCollection('content', { viewOn: 'assets', pipeline: [...stuff] }) }, async down(db, client) { // 通过标准API获取视图实例后执行删除 await db.collection('content').drop() } }
可选优化:如果需要避免回滚时因为视图已被手动删除导致流程中断,可以给drop方法传配置参数:
await db.collection('content').drop({ strict: false }),此时即使目标视图不存在也不会抛出错误。
内容的提问来源于stack exchange,提问作者George Appleton
相关产品推荐
相关产品推荐

