Вам необходимо синхронизировать закачки, используя асинхронную библиотеку обратного вызова 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
функции, которые могут делать то же самое непосредственно с обратными вызовами.