使用Strapi上传图片至Cloudinary时遇AssertionError错误,求解决方案
我之前在配置Strapi上传到Cloudinary时也碰到过这个AssertionError [ERR_ASSERTION]: Cannot wrap non-Error object错误,折腾了一阵才解决。这个错误本质是Strapi的错误处理逻辑试图包装一个非Error类型的对象,大概率和配置、依赖或者自定义逻辑有关,给你几个排查方向:
1. 先检查Cloudinary插件的配置是否正确
首先确认config/plugins.js里的上传配置有没有写错,尤其是Cloudinary的核心参数:
module.exports = ({ env }) => ({ // ...其他插件配置 upload: { config: { provider: 'cloudinary', providerOptions: { cloud_name: env('CLOUDINARY_NAME'), api_key: env('CLOUDINARY_KEY'), api_secret: env('CLOUDINARY_SECRET'), }, actionOptions: { upload: {}, delete: {}, }, }, }, });
同时检查你的.env文件,确保CLOUDINARY_NAME、CLOUDINARY_KEY、CLOUDINARY_SECRET这几个变量没有拼写错误、多余空格或者引号问题——我当初就是把CLOUDINARY_SECRET写成了CLOUDINARY_SECRECT,折腾了好久。
2. 确认Strapi和Cloudinary插件的版本兼容
版本不匹配是这类奇怪错误的重灾区。如果你用的是Strapi v4,一定要安装对应版本的@strapi/provider-upload-cloudinary,不要随便装beta版或者过时版本。
可以尝试重新安装依赖:
# 删除依赖锁文件和node_modules rm -rf node_modules package-lock.json # 重新安装 npm install
如果还是不行,可以指定插件的稳定版本安装:
npm install @strapi/provider-upload-cloudinary@latest
3. 排查自定义生命周期钩子的错误处理
如果你给上传的内容类型加了自定义的生命周期钩子(比如beforeUpload),一定要确保抛出的是标准Error对象,而不是字符串或者其他类型。
比如之前我写过这样的错误代码:
module.exports = { lifecycles: { async beforeUpload(event) { if (event.data.size > 1024 * 1024) { return '文件大小不能超过1MB'; // 这里错了! } }, }, };
正确的写法应该是抛出Error:
module.exports = { lifecycles: { async beforeUpload(event) { if (event.data.size > 1024 * 1024) { throw new Error('文件大小不能超过1MB'); } }, }, };
如果钩子返回/抛出非Error对象,Strapi的错误处理逻辑就会触发那个AssertionError。
4. 开启Debug日志定位源头
如果上面的方法都没用,可以打开Strapi的Debug日志,看更详细的错误堆栈。修改config/server.js:
module.exports = ({ env }) => ({ // ...其他配置 logger: { level: 'debug', format: 'combined', }, });
重启Strapi后再尝试上传,终端里会输出更详细的错误信息,能帮你精准定位到底是哪一行代码出了问题。
5. 单独测试Cloudinary连接
最后可以写个简单的Node脚本,测试你的Cloudinary账号是否能正常上传,排除账号本身的问题:
const cloudinary = require('cloudinary').v2; cloudinary.config({ cloud_name: '你的cloud_name', api_key: '你的api_key', api_secret: '你的api_secret', }); // 替换成你本地的一张测试图片路径 cloudinary.uploader.upload('./test.jpg', (error, result) => { if (error) console.error('Cloudinary连接错误:', error); else console.log('上传成功:', result); });
如果这个脚本能正常运行,那问题肯定出在Strapi的配置或者插件上;如果脚本也报错,那就要检查你的Cloudinary账号状态了。
内容的提问来源于stack exchange,提问作者Awais Raza

