云端上传的Async/await不起作用

7

我尝试了几种不同的方法,基本上我想从我的路由中取出cloudinary上传代码,并将其放在一个函数中,以使代码更加清晰。但是由于某些原因,我无法让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;
//       }
//    });
// }

我将之前注释掉的函数放在这里,以便您可以看到我尝试将该函数保持为非异步状态,并在回调后返回,然后在路由中使用await,但也没有起作用。我还认为我不应该需要在函数和路由中都等待,但是尝试了一下,看看是否有效。
我不确定我缺少/做错了什么。

你确定 Cloudinary API 方法确实返回 Promise 吗?如果不是,那么显然你不能直接使用 async/await - nicholaswmin
1个回答

16

由于异步函数与 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);
    })
  });
}

谢谢,工作得很完美!我想请教一下有关await/async和promises的更多知识。为什么当我将函数设置为上面注释掉的那种方式时,在uploadToCloudinary函数的回调中只返回一个值,并且没有使用async声明和try/catch块,然后在我的路由中,我的回调是异步的,并且我在接收uploadToCloudinary返回值的变量上放置了await,为什么这样不起作用,因为我在云端使用了回调函数并在我的路由中使用了异步?为什么我需要promise和resolve reject?async难道不能替代promises吗? - Jack
1
你在评论中描述的所有内容都可以用一个事实来解释:async/await 只能与 promises 一起使用:MDN - dun32
明白了!谢谢 dun! - Jack
为什么回调函数被放置在第二个参数位置?这是一个“打字错误”吗?查看文档,它应该是第三个参数,而不是第二个。我有什么遗漏的吗? - ZenVentzi
有些示例中省略了选项,而回调函数在第二个参数中,但是你说得对,如果想要遵守API的话,应该像这样:upload(image, {}, (err, url) => {}); - dun32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接