Strapi升级至3.6.8后出现模型配置获取错误与ObjectId转换失败问题
服务端报错信息:
Cast to ObjectId failed for value "http://54.179.156.135:1339/uploads/d26af51633f2451a934896bfc125ec90.jpg" at path "_id" for model "file"
报错原因
- Strapi 3.0.0测试版到3.6.8正式版迭代过程中,调整了媒体关联字段的存储逻辑:旧测试版允许关联file模型的字段直接存储文件完整URL,3.6.8版本严格要求关联字段必须存储
file模型对应的ObjectId,MongoDB在做类型校验时无法将URL字符串转为ObjectId,因此抛出该错误。 - 升级过程未做对应的数据迁移,原有业务集合中关联媒体的字段仍存储旧版本写入的URL字符串,不符合新版本的关联字段存储规则。
- 自定义业务代码中存在直接将文件URL赋值给媒体关联字段的逻辑,写入了不符合格式要求的值。
解决方法
- 校验字段配置
进入Strapi内容类型构建器,检查报错关联集合的媒体字段,确认字段类型为「媒体(关联内置file模型)」,而非字符串类型,排除字段类型配置错误问题。 - 迁移存量数据
遍历存量业务数据,将业务集合中关联字段存储的URL字符串,替换为upload_file表中对应文件记录的ObjectId。以MongoDB为例,可执行一次性迁移脚本:遍历业务表每条数据,通过存储的URL匹配upload_file集合的url字段,拿到对应文件的_id后替换原有URL值即可。 - 修正业务代码
排查所有自定义controller、service、生命周期钩子的逻辑,禁止直接将文件URL赋值给媒体关联字段,关联文件时统一赋值对应文件的ObjectId,或调用Strapi官方上传接口拿到返回的file对象后绑定关联。 - 重启服务生效
所有修改完成后,执行npm run build重新构建Strapi项目,完成后重启Strapi服务,清除浏览器缓存后再访问验证。
内容的提问来源于stack exchange,提问作者Akshat singh bais
相关产品推荐
相关产品推荐

