Strapi搭配MongoDB删除文件时报targetModel.updateMany is not a function错误
问题原因
- 核心为依赖版本冲突问题,Strapi v3.6.8仅适配MongoDB 3.x版本,你的项目中安装了MongoDB v4.1.3,版本不兼容导致数据库模型实例加载异常,
targetModel对象缺失updateMany方法。 - 项目中同时安装了
strapi-connector-bookshelf(SQL类数据库连接器)和多个mongoose相关连接器:strapi-connector-mongoose、strapi-connector-mongoose-modified、测试版strapi-hook-mongoose,多个连接器逻辑冲突,进一步加剧了模型实例的异常问题。 - 文件删除逻辑执行顺序早于关联关系清理逻辑,因此文件已被成功删除,但后续清理关联字段引用时调用
updateMany失败,触发500错误。
解决方案
- 优先推荐依赖修复方案:
- 首先卸载所有冲突依赖:
npm uninstall strapi-connector-bookshelf strapi-connector-mongoose-modified strapi-hook-mongoose mongodb- 安装Strapi v3.6.8适配的MongoDB版本:
npm install mongodb@3.7.3- 删除项目根目录下的
node_modules文件夹和package-lock.json文件,重新执行npm install安装依赖,重启Strapi服务即可修复问题。
- 临时兼容方案(若不想调整依赖版本):
找到报错文件node_modules/strapi-connector-mongoose/lib/relations.js,在两处调用targetModel.updateMany的位置前增加方法存在性判断,修改后代码如下:
修改完成后重启Strapi服务即可。if (reverseAssoc && reverseAssoc.nature === 'oneToManyMorph') { // 新增方法存在判断 if (!targetModel.updateMany) return Promise.resolve(); return targetModel.updateMany( { [targetModel.primaryKey]: val.ref && (val.ref._id || val.ref), }, { [field]: null, }, { session } ); } // 新增方法存在判断 if (!targetModel.updateMany) return Promise.resolve(); return targetModel.updateMany( { [targetModel.primaryKey]: val.ref && (val.ref._id || val.ref), }, { $pull: { [field]: primaryKeyValue }, }, { session } );
内容的提问来源于stack exchange,提问作者gizem ay
相关产品推荐
相关产品推荐

