You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:02:55