Асинхронное / ожидание для облачной загрузки не работает - PullRequest
0 голосов
/ 19 декабря 2018

Я пробовал несколько разных способов, в основном я хочу извлечь облачный код загрузки из моих маршрутов и поместить его в функцию, которую мой маршрут вызывает, чтобы сделать код чище.Но по какой-то причине я не могу заставить работать 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;
//       }
//    });
// }

Я поместил закомментированную функцию, которая была у меня раньше, чтобы вы могли видеть, что я пытался оставить функцию не асинхронной, а просто возвращаться после обратного вызова и получить ожидание в маршруте, но также не сработало.Я также не думаю, что мне нужно ждать как в функции, так и в маршруте, но попытался вот так, чтобы посмотреть, сработало ли это.

Не уверен, что я пропускаю / делаю неправильно.

1 Ответ

0 голосов
/ 19 декабря 2018

Поскольку асинхронные функции выполняются с обещаниями, а облачные функции SDK возвращаются с обратными вызовами, ваш uploadToCloudinary должен выглядеть следующим образом:

function uploadToCloudinary(image) {
  return new Promise((resolve, reject) => {
    cloudinary.v2.uploader.upload(image, (err, url) => {
      if (err) return reject(err);
      resolve(url);
    })
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...