我有一个输入标签,可以上传多张图片,并使用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" )
你需要使用一个异步回调库(如
)来同步上传,或者转换为承诺。我更喜欢承诺,但cloudinary库需要一个承诺包装器。 幸运的是,node 8+有一个内置的promise函数,可以将回调转换为promise。有了承诺,你的代码会看起来像。
async
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")
现在^该代码将一个接一个地同步执行每个上传。如果你想一次运行所有的上传(这是你原来的代码所做的),那么它将看起来像。