You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Stream上传Cloudinary时如何等待获取secure_url?

解决Cloudinary流式上传后延迟获取secure_url的问题

你的问题核心是upload_stream的回调是异步执行的,后端代码没等上传完成就直接返回了响应,导致返回的secureURLS是空的。要解决这个问题,需要把流式上传的异步逻辑包装成Promise,用await等待上传完成后再返回结果。

修改步骤:

  • 将Cloudinary的upload_stream操作包装成Promise,通过resolve/reject处理成功和失败情况
  • 使用await等待Promise完成,拿到secure_url后再组装响应数据
  • 增加错误捕获,避免上传失败导致服务异常

修改后的完整代码:

try {
  let imgSharp;
  // 图片压缩逻辑保持不变
  if(getExtensionFromMime === 'jpeg') {
    imgSharp = await sharp(blobToBuffer).jpeg({quality: 90}).toBuffer();
  } else {
    imgSharp = await sharp(blobToBuffer).png({quality: 90}).toBuffer();
  }

  // 将流式上传包装为Promise,实现异步等待
  const uploadPromise = new Promise((resolve, reject) => {
    const stream = cloudinary.v2.uploader.upload_stream(
      { folder: "uploads" },
      (error, result) => {
        if (error) {
          console.error(error);
          reject(error); // 上传失败时抛出错误
        } else {
          console.log(result?.secure_url);
          resolve(result?.secure_url); // 上传成功时返回secure_url
        }
      }
    );
    bufferToStream(imgSharp).pipe(stream);
  });

  // 等待上传完成,获取到secure_url
  const secureUrl = await uploadPromise;
  // 将URL加入响应数组(根据你的业务逻辑调整)
  secureURLS.push(secureUrl);

  // 确保拿到URL后再返回响应
  return res.json(secureURLS);
} catch (err) {
  // 捕获所有异常,返回错误响应
  console.error(err);
  return res.status(500).json({ error: '文件上传失败' });
}

关键说明:

  1. Promise包装:把原本的回调式upload_stream转换成Promise,让异步操作可以通过await等待完成
  2. await阻塞:确保只有上传完成并拿到secure_url后,才会执行res.json返回响应
  3. 全局错误捕获:用try/catch包裹整个流程,处理图片压缩、上传过程中的所有异常,避免服务崩溃

内容的提问来源于stack exchange,提问作者asdasd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:04:54