Node.js使用Formidable上传多图访问path属性报错如何解决
问题解决
错误原因
你遇到的TypeError: Cannot set property 'data' of undefined报错和formidable的path属性读取无关,核心问题是:
新创建的User实例的img字段是空数组,直接通过user.img[i]访问的元素是undefined,无法直接给undefined的data属性赋值。
同时你的代码还有三处额外错误:
- Mongoose模型中img数组元素的类型字段名为
type,你代码中写的contentType[i]和模型定义不匹配,且不需要加下标[i] - 从fields中获取的noi是字符串类型,直接作为数字遍历建议先做类型转换
- 直接用前端传递的
noi作为遍历次数不够稳妥,建议直接用files.img.length作为遍历边界,避免参数传递错误导致的异常
修复方案
将你原有遍历图片的逻辑替换为以下代码即可:
// 可选校验:如果要求上传数量和提交的noi一致可以加这个判断 if (Number(fields.noi) !== files.img.length) { return res.status(400).json({error: '上传图片数量和提交的数量不匹配'}) } // 遍历所有上传的图片 for(let i = 0; i < files.img.length; i++) { const currentFile = files.img[i]; if (currentFile) { // 主动往img数组中添加新元素,而不是直接给下标位置赋值 user.img.push({ data: fs.readFileSync(currentFile.path), type: currentFile.type }); } }
额外优化建议
- 图片读取完成后可以调用
fs.unlinkSync(currentFile.path)删除formidable生成的临时文件,避免占用磁盘空间 - 大体积图片不推荐直接以Buffer形式存储在MongoDB中,更建议存储本地文件路径或者对接云对象存储服务保存文件地址
内容的提问来源于stack exchange,提问作者sanket kushwaha
相关产品推荐
相关产品推荐

