相关文章推荐
旅行中的钥匙  ·  vue.js - I'm getting ...·  1 周前    · 
爱笑的热带鱼  ·  关于执行npm install ...·  1 周前    · 
高大的黑框眼镜  ·  npm ...·  1 周前    · 
坏坏的保温杯  ·  从根本上解决npm ...·  1 周前    · 
读研的豆芽  ·  JavaScript 调试功能 - ...·  1 月前    · 
讲道义的水桶  ·  实习内推 | ...·  1 年前    · 
失眠的灭火器  ·  vue+element ...·  1 年前    · 

使用Node Js和ForEach循环在cloudinary中进行多次上传

0 人关注

我有一个输入标签,可以上传多张图片,并使用cloudinary和formidable包将它们上传到cloudinary。

理想情况下,我想拉出URL并将其保存在我的数据库中,在那里我有所有其他信息。

但未能在数组中检索到如下所示的URLs。

以它为目标,创建一个对象,将其与URL一起保存在DB中。

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" )
arrays
node.js
foreach
cloudinary
Anteneh Tadesse Yalew
Anteneh Tadesse Yalew
发布于 2020-04-02
1 个回答
CaptEmulation
CaptEmulation
发布于 2020-04-02
已采纳
0 人赞同

你需要使用一个异步回调库(如 async )来同步上传,或者转换为承诺。我更喜欢承诺,但cloudinary库需要一个承诺包装器。 幸运的是,node 8+有一个内置的promise函数,可以将回调转换为promise。有了承诺,你的代码会看起来像。

 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")