Node.js中如何等待Cloudinary文件上传完成后再执行后续函数
解决Cloudinary上传完成后再执行MySQL插入的问题
你的问题出在Cloudinary的文件上传是异步操作,而当前的MySQL插入代码会同步执行——三个上传还没完成、frontURL/backURL/selfieURL还没被赋值为真实的secure_url,插入操作就已经执行了,所以数据库里存的都是初始的temp_string。
解决方案:用Promise+async/await等待所有上传完成
Cloudinary的uploader.upload方法如果不传入回调函数,会返回一个Promise,我们可以利用这个特性,结合Promise.all等待三个上传任务全部完成,再执行数据库插入。
修改后的代码如下:
app.post('/create', upload.array('uploaded_file'), async function (req, res) { try { const wallet = req.body.wallet const name = req.body.fname const nic = req.body.nic const nicfront = req.files[0].path; const nicback = req.files[1].path; const selfie = req.files[2].path; const state = 1 // 并行执行三个上传操作,等待全部完成 const [frontResult, backResult, selfieResult] = await Promise.all([ cloudinary.uploader.upload(nicfront), cloudinary.uploader.upload(nicback), cloudinary.uploader.upload(selfie) ]) // 提取三个secure_url const frontURL = frontResult.secure_url const backURL = backResult.secure_url const selfieURL = selfieResult.secure_url // 等待数据库插入完成 await new Promise((resolve, reject) => { db.query( "INSERT INTO applications (wallet, name, nic, nicfront, nicback, selfie, state) VALUES (?,?,?,?,?,?,?)", [wallet, name, nic, frontURL, backURL, selfieURL, state], (err, result) => { if (err) reject(err) else resolve(result) } ) }) res.send("插入MySQL成功!") } catch (err) { console.error(err) res.status(500).send("上传或插入失败:" + err.message) } }); app.listen(3001, () => { db.connect(function (err) { if (err) throw err; console.log("数据库连接成功") }); });
关键改动说明
- 给路由处理函数加上
async关键字,内部可使用await控制异步流程 - 用
Promise.all并行发起三个上传请求,等待所有请求完成后再继续执行,比串行上传效率更高 - 把回调式
db.query封装成Promise,用await等待插入操作完成,确保异步顺序正确 - 用
try/catch捕获所有可能的错误(上传失败、数据库插入失败等),给客户端返回对应的错误响应
内容的提问来源于stack exchange,提问作者Sandaru Fernando
相关产品推荐
相关产品推荐

