Несколько загрузок в облачном виде с использованием Node Js и цикла ForEach - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть тег ввода для загрузки нескольких изображений и их загрузки в облачный каталог с использованием облачных и грозных пакетов.

В идеале я хотел получить URL-адрес и сохранить его в своей БД, где у меня есть вся остальная информация .

Но не удалось получить URL-адреса, показанные ниже в массиве.

Задайте его для создания объекта для сохранения в БД с URL-адресами.


app.post("/newcampbook",(req,res)=>{
  new formidable.IncomingForm({ multiples: true }).parse(req,(err,fields,file)=>{
   if(!err){     
     var pathArray = [];
        file.image.forEach(e =>{
            pathArray.push(e.path)
        })
        var savedUrl = [];
        pathArray.forEach(e =>{
            cloudinary.uploader.upload(e, (err,savedImage)=>{
                if(!err){
                    savedUrl.push(savedImage.url)
                    console.log(savedUrl)
                }
            })
        })
    res.send("Testing to upload")
   } else {
    console.log(err);
    res.send("Error")
   }
 })
})

1 Ответ

0 голосов
/ 01 апреля 2020

Вам необходимо синхронизировать закачки, используя асинхронную библиотеку обратного вызова c, например async, или конвертировать в обещания. Я предпочитаю обещания, но облачной библиотеке нужна оболочка для обещаний. К счастью, узел 8+ поставляется со встроенной функцией Promisify, которая преобразует обратные вызовы в обещания. С обещаниями ваш код будет выглядеть так:

 const { promisify } = require('util')

 // Converts cloudinary callback interface into promise
 const uploadAsync = promisify(cloudinary.uploader.upload.bind(cloudinary.uploader))

 app.post("/newcampbook",(req,res)=>{
 new formidable.IncomingForm({ multiples: true }).parse(req, async (err,fields,file)=>{
   if(!err){     
     var pathArray = [];
     file.image.forEach(e =>{
       pathArray.push(e.path)
     })
     var savedUrl = [];
     for(let e of pathArray) {
       const { url } = await uploadAsync(e)
       savedUrl.push(url)
     }
     res.send("Testing to upload")
   }else{
    console.log(err);
    res.send("Error")
  }
 })
})

Теперь ^ этот код будет выполнять каждую загрузку синхронно один за другим. Если вы хотите запустить все загрузки одновременно (что и делает ваш оригинальный код), то это будет выглядеть так:

 const { promisify } = require('util')

 // Converts cloudinary callback interface into promise
 const uploadAsync = promisify(cloudinary.uploader.upload.bind(cloudinary.uploader))

 app.post("/newcampbook",(req,res)=>{
 new formidable.IncomingForm({ multiples: true }).parse(req, async (err,fields,file)=>{
   if(!err){     
     var pathArray = [];
     file.image.forEach(e =>{
       pathArray.push(e.path)
     })
     var savedUrl = (await Promise.all(pathArray.map(uploadAsync))).map(({ url }) => url)
     res.send("Testing to upload")
   }else{
    console.log(err);
    res.send("Error")
  }
 })
})

Если вы хотите использовать библиотеку async, посмотрите на parallel и series функции, которые могут делать то же самое непосредственно с обратными вызовами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...