如何等待多张图片上传至Cloudinary完成后返回URL数组
问题根因
Array.prototype.forEach不支持异步等待,对其使用await不会生效,代码会直接跳过等待逻辑执行后续返回操作- 未收集所有上传异步任务的Promise实例,无法实现批量等待所有上传任务执行完成
- 现有代码会在上传任务未完成时就返回空的
photoAlbum数组
修复方案
1. 补充依赖引入(原有代码缺失uuid引入)
先安装uuid依赖:npm install uuid
2. 修改cloudinary.js代码
require("dotenv").config() const cloudinary = require("cloudinary").v2 const { v4: uuidv4 } = require('uuid'); module.exports.cloudinaryUpload = async (imgFiles, username) => { // 映射生成所有上传任务的Promise数组 const uploadTasks = imgFiles.map(async (img) => { const imageid = uuidv4(); try { const uploadResult = await cloudinary.uploader.upload(img, { folder: username, resource_type: "image", public_id: imageid }); console.log("*** Success: Cloudinary Upload: ", uploadResult.url); return { imageid, url: uploadResult.url }; } catch (err) { console.log("*** Error: Cloudinary Upload: ", err); // 可根据业务需求调整错误处理逻辑,例如抛出错误终止全部任务 return { imageid, url: null, errMsg: err.message }; } }); // 等待所有上传任务全部执行完成 const photoAlbum = await Promise.all(uploadTasks); console.log("Cloudinary upload done: ", photoAlbum); return photoAlbum; }
3. 原有server.js无需修改
现有调用逻辑可以直接正常使用,返回的photoAlbum已经是所有上传任务执行完成后的结果。
可选配置:
如果需要保证所有图片全部上传成功才返回,任意一张上传失败就抛出错误,只需要删除catch块的返回逻辑,改为抛出错误即可,Promise.all遇到任意Promise rejected会直接终止执行并抛出错误。
内容的提问来源于stack exchange,提问作者Jimmy C
相关产品推荐
相关产品推荐

