【问题标题】:Async/await for cloudinary upload not working异步/等待云上传不起作用
【发布时间】:2019-05-20 02:22:06
【问题描述】:

我尝试了几种不同的方法,基本上我想从我的路由中取出云端上传代码并将其放入我的路由调用的函数中以使代码更干净。但由于某种原因,我无法让 async/await 工作/等待上传完成后再完成。

这是我的路线示例:

var fieldsUpload = upload.fields([{ name: 'image1', maxCount: 1 }, { name: 'image2', maxCount: 1 }])
router.post('/upload', fieldsUpload, async function (req, res, next) {

   var url1 = await uploadToCloudinary(req.files['image1'][0].path);
   console.log("Cloudinary url: " + url1);
   var url2 = await uploadToCloudinary(req.files['image2'][0].path);
   console.log("Cloudinary url: " + url2);


   res.send("Succesfull Upload"); 

});

这是我的功能:

async function uploadToCloudinary(image) {
   try{
      let url = await cloudinary.v2.uploader.upload(image);
   }
   catch(err){ console.log(err)}
}

// function uploadToCloudinary(image) {
//    cloudinary.v2.uploader.upload(image, function(error, result) {
//       if(error) {
//          console.log(error);
//       }
//       else {
//          console.log("Succesfully uploaded image to cloudinary!")
//          return result.secure_url;
//       }
//    });
// }

我把之前的注释掉了,所以你可以看到我尝试让函数不是异步的,只是在回调之后返回,并且在路由中有等待,但也没有工作。我也不认为我应该在函数和路由中都需要等待,但尝试这样看看它是否有效。

不知道我错过了什么/做错了什么。

【问题讨论】:

  • 您确定云 API 方法实际上返回 Promises 吗?如果他们不这样做,那么您显然不能直接将async/await 与他们一起使用..

标签: node.js async-await cloudinary


【解决方案1】:

因为异步函数使用 Promise 运行,而 Cloudinary SDK 函数返回回调,所以您的 uploadToCloudinary 应该如下所示:

function uploadToCloudinary(image) {
  return new Promise((resolve, reject) => {
    cloudinary.v2.uploader.upload(image, (err, url) => {
      if (err) return reject(err);
      return resolve(url);
    })
  });
}

【讨论】:

  • 谢谢你工作完美!。我想了解更多关于等待/异步和承诺的信息,为什么当我有我的函数作为上面注释的内容时,我只返回一个值uploadToCloudinary 函数的回调,我没有异步声明,也没有 try/catch 块,然后在我的路由中,我的回调是异步的,我在接收到 uploadToCloudinary 返回的 var 上放置了一个等待,为什么那不起作用,因为我在路由中使用了 cloudinary 和 async 的回调?为什么我需要承诺并解决拒绝?并且 async 不会取代 Promise 吗?
  • 您在评论中描述的所有内容只能用一个事实来解释:async / await 仅适用于承诺:MDN
  • 知道了!谢谢你!
  • 为什么将回调 fn 作为第二个参数?这是“错别字”吗?查看文档,它应该是第三个参数,而不是第二个。我错过了什么吗?
  • 有些例子省略了选项,回调在第二个参数,但你说得对,如果要尊重API,应该像upload(image, {}, (err, url) => {});
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
相关资源
最近更新 更多