嵌套查询 在Node.js中等待循环查询mysql数据库结束后,再返回响应。(async第三方模块)

需求:

嵌套查询,当完成第一次对数据库的查询后,想要对另一个表再进行查询,且需要用到第一次查询的结果,该结果为对象数组。

对另一个表进行查询时,是根据该对象数组中每个元素的其中一个属性来查询的,而且对 对象数组 的每次循环都要改变数组元素(即为每个元素增加一个新的属性)。

错误写法:(省略号就是省略了一些不重要的代码)

exports.xxx = (req, res) => {
   ...
    const sql = `select * from xxx1 where id=? `
    db.query(sql, [id],  (err, results) => {
        // 执行 SQL 语句失败
        if (err) return ...
        // SQL 语句执行成功
        if (results.length > 0) {
           const sql2= `select * from xxx2 where cid=? and id=?`
           for (...) {
               db.query(sql2, [results[i].cid, id], function (err, results2) {
                    // 执行 SQL 语句失败
                    if (err) return ...
                    // SQL 语句执行成功
                    if (results2.length === 1) {
                        results[i]= Object.assign(results[i], {
                            liked: true
                        });
                    } else {
                        results[i]= Object.assign(results[i], {
                            liked: false
                        });
                    }

                });
            }
            res.send({
                status: 200,
                message: '成功',
                data: results,
            }) 

        } else {
            res.send({
                status: 200,
                message: '暂无',
                data: []
            })
        }
    })
}

我本意是想让循环结束以后,再send数据回前端的,但是因为代码执行顺序,导致 res.send先执行了,即前端收到的是未处理的第一次查数据库的结果。

解决方法:(async第三方模块,标红的就是重点

//导入async模块(记得要先npm install async)

const async = require('async');

......

exports.xxx = (req, res) => {
   ...
    
    const sql = `select * from xxx1 where id=? `
    db.query(sql, [id],  (err, results) => {
        // 执行 SQL 语句失败
        if (err) return ...
        // SQL 语句执行成功
        if (results.length > 0) {
            const sql2= `select * from xxx2 where cid=? and id=?`

           //这里 async.forEachOf的第一个参数就是要循环的数组,剩下的应该看得懂
            async.forEachOf(results, function (item, i, callback) {
                db.query(sql2, [item.cid, id], function (err, results2) {
                    // 执行 SQL 语句失败
                    if (err) return ...
                    // SQL 语句执行成功
                    if (results2.length === 1) {
                        item = Object.assign(item, {
                            liked: true
                        });
                    } else {
                        item = Object.assign(item, {
                            liked: false
                        });
                    }
                    callback();
                });
            }, function (err) {
                if (err) {
                    //handle the error if the query throws an error
                    return ...
                } else {
                    //whatever you wanna do after all the iterations are done
                    res.send({
                        status: 200,
                        message: '成功',
                        data: results,
                    }) 
                }
            });
        } else {
            res.send({
                status: 200,
                message: '暂无',
                data: []
            })
        }
    })
}

参考文章:node.js for循环中的mysql查询 | (1r1g.com)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值