【问题标题】:How to create nested json array properly while looping SQL database in node.js?在 node.js 中循环 SQL 数据库时如何正确创建嵌套的 json 数组?
【发布时间】:2017-02-01 08:51:17
【问题描述】:

这是我想要实现的目标,我将像这样创建数组 json:

[{
    "KODE_CLAIM" : "MMKLKKK01",
    "DETAILS" : {
        "No_SVC" : "1233456789",
        "Date_SVC" : "01-01-2016"
    }
},
{
    "KODE_CLAIM" : "MMKLKKK02",
    "DETAILS" : {
        "No_SVC" : "1233456789",
        "Date_SVC" : "01-01-2016"
    }
}]

这是一个嵌套的 JSON,我从 SQL Server 获取数据。这就是我所做的:

exports.reportClaim = function(req, resp) {
    var kode_bass = req.params.kode_bass
    var tgl_Awal = req.params.tgl_Awal
    var tgl_Akhir = req.params.tgl_Akhir
    var hddt = []
    var details = [];

    console.log(kode_bass,tgl_Awal,tgl_Akhir);

    db.executeSql("exec NG_CLAIM_REPORT_HD '" + kode_bass + "','" + tgl_Awal + "','" + tgl_Akhir + "'" , function(data, err) {
        if (err) {
            httpMsgs.show500(req, resp, err);
        } else {
            for(var i=0;i < data.length; i++){
                console.log(data[i].KODE_CLAIM);
                hddt.push(data[i].KODE_CLAIM)
                db.executeSql("exec NG_CLAIM_REPORT_DT '" + data[i].KODE_CLAIM + "'" , function(data, err) {
                    if (err) {
                        httpMsgs.show500(req, resp, err);
                    } else {

                        for(var i=0;i < data.length; i++){
                            console.log(data.length);
                            hddt[details] = data;
                            console.log(hddt);
                        }
                    };
                });
            }

            httpMsgs.sendJson(req, resp, hddt);
        };
    });
};

我面临两个问题,首先我无法将数据推送到 hddt[] 数组中,其次我认为回调导致 JSON 已经发送到网页,但是 for 循环延迟了,我认为这是因为回调正确?

当我在这里做第二个循环时:

        db.executeSql("exec NG_CLAIM_REPORT_DT '" + data[i].KODE_CLAIM + "'" , function(data, err) {
            if (err) {
                httpMsgs.show500(req, resp, err);
            } else {
                for(var i=0;i < data.length; i++){
                    console.log(data.length);
                    hddt[details] = data;
                }
            };
        });

控制台中的错误说,“详细信息”未定义 我该如何解决?我还有另一种方法可以在没有回调的情况下执行 SQL Server?以及如何将我的第二个存储过程数据推送到我的数组对象中并将其作为 JSON 返回?

下面是我执行“NG_CLAIM_REPORT_HD”时的SQL数据 KODE_CLAIM 1 CLM/B094/1403/0001 2 CLM/B094/1403/0002

这是我使用参数“CLM/B094/1403/0001”执行“NG_CLAIM_REPORT_DT”时的 SQL 数据

      KODE_CLAIM              No_SVC                Date_SVC
1. CLM/B094/1403/0001   SVC/B094/1401/0026  2014-01-20 00:00:00.000
2. CLM/B094/1403/0001   SVC/B094/1309/0003  2013-09-18 00:00:00.000

当我使用参数“CLM/B094/1403/0002”执行 SP NG_CLAIM_REPORT_DT 时

     KODE_CLAIM              No_SVC                 Date_SVC
1. CLM/B094/1403/0002   SVC/B094/1312/0006  2013-12-16 00:00:00.000
2. CLM/B094/1403/0002   SVC/B094/1312/0005  2013-12-16 00:00:00.000

所以我想要的 JSON 数据是:

[{
    "KODE_CLAIM" : "CLM/B094/1403/0001",
    "DETAILS" : [
        {
        "No_SVC" : "SVC/B094/1401/0026",
        "Tgl_SVC" : "2014-01-20 00:00:00.000"
        },
        {
        "No_SVC" : "SVC/B094/1309/0003",
        "Tgl_SVC" : "2013-09-18 00:00:00.000"
        }
    ]
},
{
    "KODE_CLAIM" : "CLM/B094/1403/0002",
    "DETAILS" : [{
        "No_SVC" : "SVC/B094/1312/0006",
        "Tgl_SVC" : "2014-01-20 00:00:00.000"
        },
        {
            "No_SVC" : "SVC/B094/1312/0005",
            "Tgl_SVC" : "2013-09-18 00:00:00.000"
        }
    ]
}]

【问题讨论】:

  • i cannot push the data into hddt[] array 为什么不呢? hddt.push(data[i].KODE_CLAIM) 行是否有错误?
  • @JaromandaX 抱歉,我添加了更多解释以获得更多详细信息,你能帮帮我吗?
  • 那是因为您发布的代码中没有定义名为 details 的变量
  • 嗨,我检查了你的代码,但看不到 details 变量,你在 for 循环中有一个 i 变量。你也有第一个问题,因为我相信你没有details
  • 我已经更新了我的代码,当我尝试 console.log(hddt) 它让我永远循环,我错过了什么?

标签: javascript arrays sql-server node.js callback


【解决方案1】:

您需要使用对象 {} 以及数组,因为您的输出是对象数组,包括对象数组

您还需要有一些方法来等待所有异步请求完成

使用 Promise 的一种处理方法

exports.reportClaim = function (req, resp) {
    var kode_bass = req.params.kode_bass;
    var tgl_Awal = req.params.tgl_Awal;
    var tgl_Akhir = req.params.tgl_Akhir;

    // helper function to simply "promisify" db.executeSql
    var executeSqlP = function executeSqlP(db, sql) {
        return new Promise(function (resolve, reject) {
            db.executeSql(sql, function (data, err) {
                if (err) {
                    return reject(err);
                }
                resolve(data);
            });
        });
    };

    executeSqlP(db, "exec NG_CLAIM_REPORT_HD '" + kode_bass + "','" + tgl_Awal + "','" + tgl_Akhir + "'")
    .then(function (claims) {
        return Promise.all(claims.map(function (claim) {
            return executeSqlP(db, "exec NG_CLAIM_REPORT_DT '" + claim.KODE_CLAIM + "'")
            .then(function (details) {
                return { KODE_CLAIM: claim.KODE_CLAIM, DETAILS: details.map(function (detail) {
                        return {No_SVC: detail.No_SVC, Tgl_SVC: detail.Date_SVC};
                    }) 
                };
            });
        }));
    })
    .then(function (hddt) {
        httpMsgs.sendJson(req, resp, hddt);
    })
    .catch(function (err) {
        httpMsgs.show500(req, resp, err);
    });
};

ES2016+ 的代码非常整洁

exports.reportClaim = function(req, resp) {
    var kode_bass = req.params.kode_bass;
    var tgl_Awal = req.params.tgl_Awal;
    var tgl_Akhir = req.params.tgl_Akhir;
    var executeSqlP = (db, sql) => new Promise((resolve, reject) => {
        db.executeSql(sql , function(data, err) {
            if (err) {
                return reject(err);
            }
            resolve(data);
        });
    });


    executeSqlP(db, "exec NG_CLAIM_REPORT_HD '" + kode_bass + "','" + tgl_Awal + "','" + tgl_Akhir + "'")
    .then(claims => 
        Promise.all(claims.map(claim => 
            executeSqlP(db, "exec NG_CLAIM_REPORT_DT '" + claim.KODE_CLAIM + "'")
            .then(details => 
                ({KODE_CLAIM: claim.KODE_CLAIM, DETAILS: details.map(detail => 
                    ({No_SVC:detail.No_SVC, Tgl_SVC:detail.Date_SVC})
                )})
            )
        ))
     )
    .then(hddt => httpMsgs.sendJson(req, resp, hddt))
    .catch(err => httpMsgs.show500(req, resp, err));
};

【讨论】:

  • 但我试图理解代码,如何将第二个 SP 结果合并为“KODE_CLAIM”作为一个 JSON 树与第一个 SP 结果?
  • 是不是你需要帮助理解的details.map?
  • 是的,是 claim.map 将细节映射到数组吗?它如何匹配每个Header(根数组json)的DETAIL值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2019-11-12
相关资源
最近更新 更多