Node.js Cloudinary异步等待一次上载多个图像,然后保存到节点js中的阵列

Node.js Cloudinary异步等待一次上载多个图像,然后保存到节点js中的阵列,node.js,api,cloudinary,Node.js,Api,Cloudinary,您好,我正在寻找一个API服务器端上传的解决方案,使用Node Js asyc wait功能上传多个图像,然后捕获到一个数组中。我遵循这一点来实现我的代码。在控制台中,它显示了我期望的数组,但它没有给我任何响应 这是我到目前为止试过的 exports.upload_image = async(req, res) =>{ //let filePaths = req.files.path; let multipleUpload = new Promise(async (resolve

您好,我正在寻找一个API服务器端上传的解决方案,使用Node Js asyc wait功能上传多个图像,然后捕获到一个数组中。我遵循这一点来实现我的代码。在控制台中,它显示了我期望的数组,但它没有给我任何响应

这是我到目前为止试过的

exports.upload_image = async(req, res) =>{
  //let filePaths = req.files.path;

  let multipleUpload = new Promise(async (resolve, reject) => {
    let upload_len = req.files.length;
    let upload_res = new Array();

      for(let i = 0; i < upload_len; i++)
      {
          let filePath = req.files[i].path;
          await cloudinary.v2.uploader.upload(filePath, { use_filename: true, unique_filename: false }, function (error, result) {
              if(upload_res.length === upload_len)
              {
                /* resolve promise after upload is complete */
                resolve(upload_res)
              }
              else if(result)
              {
                /*push public_ids in an array */  
                upload_res.push(result.public_id);
              } else if(error) {
                console.log(error)
                reject(error)
              }

          })

      } 
  })
  .then((result) => result)
  .catch((error) => error)

  let upload = await multipleUpload;
  res.json({'response':upload})
}
exports.upload\u image=async(req,res)=>{
//让filepath=req.files.path;
让multipleUpload=新承诺(异步(解析、拒绝)=>{
让upload_len=req.files.length;
让upload_res=new Array();
for(设i=0;i结果)
.catch((错误)=>错误)
让上传=等待多重上传;
res.json({'response':upload})
}

如有任何建议,将不胜感激。谢谢

我会采取不同的方法。您正在以一种很难阅读和调试的方式混合承诺和异步/等待

我会这样做: 将文件映射到承诺数组,然后调用
Promise.all()

下面是一个带有假上传功能和“文件”列表的片段:

功能上传(文件,fn){
//伪造上传文件,只需将文件作为id返回
setTimeout(()=>fn(空{
public\u id:文件
}),Math.floor(Math.random()*500))
}
//伪请求文件
让文件=[1,2,3,4,5,6]
让我们上传图片=()=>{
让upload_res=files.map(文件=>newpromise((解析,拒绝)=>{
上传(文件,(错误,结果)=>{
如果(错误)拒绝(错误)
else解析(结果.公共\u id);
})
}))
承诺。全部(上传)
。然后(结果=>console.log({
“响应”:结果
}))
.catch(错误=>error)
}

上传图片()
我在这里会采取不同的方法。您正在以一种很难阅读和调试的方式混合承诺和异步/等待

我会这样做: 将文件映射到承诺数组,然后调用
Promise.all()

下面是一个带有假上传功能和“文件”列表的片段:

功能上传(文件,fn){
//伪造上传文件,只需将文件作为id返回
setTimeout(()=>fn(空{
public\u id:文件
}),Math.floor(Math.random()*500))
}
//伪请求文件
让文件=[1,2,3,4,5,6]
让我们上传图片=()=>{
让upload_res=files.map(文件=>newpromise((解析,拒绝)=>{
上传(文件,(错误,结果)=>{
如果(错误)拒绝(错误)
else解析(结果.公共\u id);
})
}))
承诺。全部(上传)
。然后(结果=>console.log({
“响应”:结果
}))
.catch(错误=>error)
}

upload_image()
您没有调用函数
等待多重加载()
;感谢您的快速响应,仍然无法工作。它给了我一个错误,说“multipleUpload不是一个函数”,你是
await
ing
cloudinary.v2.uploader.upload
,但我不认为它会返回一个承诺。
await
只对返回承诺的函数有效,而不是只接受普通回调的函数。您必须“promisify”该函数(将回调转换为承诺)才能将其与
wait
一起使用。在这个
if(upload\u res.length==upload\u len)
代码行中,我修改为
if(upload\u res.length==req.files.length-1)
然后它给了我响应,但它只有两张图片的细节,而我在邮递员上发送了三张图片。以下是响应<代码>{“响应”:[“1529884523808BEBB1D5FF29328157080E4E2E5D15A29C5AA34a”,“1529884523809D2BF46FBE4C12E064811303D85F49F125E18FBD39”]}
您没有调用函数
等待多重加载();感谢您的快速响应,仍然无法工作。它给了我一个错误,说“multipleUpload不是一个函数”,你是
await
ing
cloudinary.v2.uploader.upload
,但我不认为它会返回一个承诺。
await
只对返回承诺的函数有效,而不是只接受普通回调的函数。您必须“promisify”该函数(将回调转换为承诺)才能将其与
wait
一起使用。在这个
if(upload\u res.length==upload\u len)
代码行中,我修改为
if(upload\u res.length==req.files.length-1)
然后它给了我响应,但它只有两张图片的细节,而我在邮递员上发送了三张图片。以下是回复
{“回复”:[“1529884523808BEBB1D5FF29328157080E4E2E5D15A29C5AA34a”,“1529884523809D2BF46FBE4C12E064811303D85F49F125E18FBD39”]}
这个答案帮助我一次上传多个图像。谢谢这个答案帮助我一次上传多张图片。谢谢
exports.upload_image = async(req, res) =>{
    // res_promises will be an array of promises
    let res_promises = req.files.map(file => new Promise((resolve, reject) => {
        cloudinary.v2.uploader.upload(file.path, { use_filename: true, unique_filename: false }, function (error, result) {
            if(error) reject(error)
            else resolve(result.public_id)
        })
    })
    )
    // Promise.all will fire when all promises are resolved 
    Promise.all(res_promises)
    .then(result =>  res.json({'response':upload}))
    .catch((error) => {/*  handle error */ })
}