如何在nodejs中使用promise执行两个mysql查询?

时间:2017-08-24 03:59:51

标签: mysql arrays json node.js promise

这是我要实现的目标,我希望从我的node.js服务器返回的JSON数据基于第一个mysql查询(数组JSON数据)的值加入

如果我只想执行两个mysql查询,我只需启用 multipleStatements:true ,那么代码将是这样的:

app.post('/ product',function(req,res){

connection.query('call getProductList; call rowCountTotal', function (err, rows, fields) {
    if (!err) {
        var response = [];

        if (rows.length != 0) {
            response.push({ 'result': 'success', 'data': rows });
        } else {
            response.push({ 'result': 'error', 'msg': 'No Results Found' });
        }

        res.setHeader('Content-Type', 'application/json');
        res.status(200).send(JSON.stringify(response));
    } else {
        res.status(400).send(err);
    }
});

});

比数据显示两个JSON在两个数组中分开,但我想在这里构建的是一个带有多个数组JSON数据的JSON,如下所示:

我想要的示例JSON:

[  
   {  
      "product_id":"1",
      "product_name":"MX-001",
      "product_attachment":[  
         {  
            "product_id":"1",
            "product_attachment_id":"1",
            "file_name":"maxgrand5.jpg",
            "file_path":"assets"
         }
      ]
   }
]

以下是我在我的node.js服务器端代码中尝试做的事情,我试图使用

Promise.all (i think this code i should use right?) :

    return new Promise(function(resolve, reject) {

        Promise.all(connection.query('call getProductSingle("'+ product_series +'")', function (err, rows, fields) {
            if (!err) {
                var response = [];

                if (rows.length != 0) {
                    response.push({ 'result': 'success', 'data': rows });
                } else {
                    response.push({ 'result': 'error', 'msg': 'No Results Found' });
                }

                connection.query('call getProductAttachment("'+ rows[0][0].product_id +'")', function (err, rowsAttachment, fields) {
                    if (!err) {
                        console.log("second query");
                        if (rowsAttachment.length != 0) {
                            response.push({'product_attachment': rowsAttachment });
                        } else {
                            response.push({ 'result': 'error', 'msg': 'No Results Found' });
                        }
                    }
                });
                console.log("outside second query");
                res.setHeader('Content-Type', 'application/json');
                res.status(200).send(JSON.stringify(response));
            } else {
                res.status(400).send(err);
            }

            console.log("last");
            if (err) {
                return reject(err);
            }
            resolve(res);
        }));
    });

这是我的存储过程结果,以'getProductSingle'命名:

  1. product_id = 1
  2. product_name = MX-001
  3. 这是我的第二个程序结果'getProductAttachment':

    1. product_id = 1
    2. file_name = maxgrand5.jpg
    3. file_path = assets
    4. product_attachment_id = 1
    5. 一个product_id可以有多个product_attachment_id

      我如何才能加入数据?

      我刚刚更新了我的问题,问题是当我提出请求时,第二个查询为时已晚,我应该使用诺言让它不迟,怎么做?

2 个答案:

答案 0 :(得分:1)

首先,我创建了一个查询,其中product_single表连接到product_attachments,可能您希望使用WHERE子句或使用LIMITOFFSET的分页机制对其进行限制:

SELECT ps.product_id, ps.product_name, pa.product_attachment_id,
pa.file_name, pa.file_path
FROM product_single ps
LEFT JOIN product_attachment pa
ON ps.product_id = pa.product_id
ORDER by ps.product_id,pa.product_attachment_id;

在以下代码中,我将使用call product_join_att引用此查询。

return new Promise(function(resolve, reject) {
    var result_products = [];
    var result_attachments = [];
    var old_id = undefined;
    var old_name = undefined;
    var new_id = undefined;
    var row_index = 0;
    connection.query('call product_join_att', function (err, rows, fields) {
        if (err) {
            reject(err);
            return;
        } else if (rows.length == 0) {
            reject(new Error('No Results found'));
            return;
        }
        while (row_index < rows.length  ) {
            new_id = rows[row_index].product_id;
            if (old_id !== new_id) { // any new line with an new id...
                if (typeof old_id !== 'undefined') { // when the old line is existing
                    result_products.push( // push the product
                        {"product_id": old_id.toString(),
                         "product_name":old_name,
                         "product_attachment": result_attachments
                        });
                }
                old_id = new_id; // remember the new_id
                old_name = rows[row_index].product_name;// and name
                product_attachments = []; // and initialize attachments.
            }
            product_attachments.push({ // provide the inner attachment informations.
                "product_id": new_id,
                "product_attachment_id" : rows[row_index].product_attachment_id,
                "file_name" : rows[row_index].file_name;
                "file_path" : rows[row_index].file_path;
            });
            row_index++; // and go to the next row.
        }
        if (typeof old_id !== 'undefined') { // if there are still data
            result_products.push( // push the last line also.
                {"product_id": old_id.toString(),
                 "product_name":old_name,
                 "product_attachment": result_attachments
                });
        }
    } // query
    resolve(result_products);
} // end of promise...

答案 1 :(得分:0)

我用简单的解决方案来解决这个问题,但这种方式不是&#34;承诺&#34;完成它的方法,如果你们面对像这样的问题,那么决定使用哪个。由于我不需要很多数据来循环,只需要一个具有一维JSON数组的根数组JSON,我就会这样说:

app.post('/getsingleproduct', function (req, res) {
    var product_series = req.body.product_series;

    connection.query('call getProductSingle("'+ product_series +'")', function (err, rows, fields) {
        if (!err) {
            var response = [];

            if (rows.length != 0) {
                response.push({ 'result': 'success', 'data': rows[0] });
            } else {
                response.push({ 'result': 'error', 'msg': 'No Results Found' });
            }

            connection.query('call getProductAttachment("'+ rows[0][0].product_id +'")', function (err, rowsAttachment, fields) {
                if (!err) {

                    if (rowsAttachment.length != 0) {

                        response[0].data[0]['product_attachment']= rowsAttachment[0];

                        res.setHeader('Content-Type', 'application/json');
                        res.status(200).send(JSON.stringify(response));
                    } else {
                        response.push({ 'result': 'error', 'msg': 'No Results Found' });
                        res.status(400).send(err);
                    }
                }
            });

        } else {
            res.status(400).send(err);
        }
    });

});

这是一种非承诺的方式,如果你需要承诺方式,请寻找@Myonara的答案,我认为最好的