Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js中循环SQL数据库时正确创建嵌套json数组?_Javascript_Arrays_Sql Server_Node.js_Callback - Fatal编程技术网

Javascript 如何在node.js中循环SQL数据库时正确创建嵌套json数组?

Javascript 如何在node.js中循环SQL数据库时正确创建嵌套json数组?,javascript,arrays,sql-server,node.js,callback,Javascript,Arrays,Sql Server,Node.js,Callback,以下是我试图实现的目标,我将创建如下数组json: [{ "KODE_CLAIM" : "MMKLKKK01", "DETAILS" : { "No_SVC" : "1233456789", "Date_SVC" : "01-01-2016" } }, { "KODE_CLAIM" : "MMKLKKK02", "DETAILS" : { "No_SVC" : "1233456789", "D

以下是我试图实现的目标,我将创建如下数组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);
        };
    });
};
当我使用参数CLM/B094/1403/0002执行SP NG_索赔报告时

     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"
        }
    ]
}]

您需要使用对象{}和数组,因为您的输出是包含对象数组的对象数组

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

一种处理方法是承诺

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));
};

我无法将数据推送到hddt[]数组中为什么不能?你在hddt.pushdata[i].KODE_索赔行上有错误吗?@JaromandaX抱歉,我添加了更多详细说明,你能帮助我吗?那是因为你发布的代码中没有名为details definedHi的变量,我检查了你的代码,看不到和details变量,你在for循环中有一个i变量。你也有第一个问题,因为你没有我相信的细节。我已经更新了我的代码,当我尝试控制台。loghddt它给我永远循环,我错过了什么?但我试图理解代码,第二个SP结果如何与第一个SP结果合并为一个JSON树,并合并到KODE_声明中?您需要帮助理解的是details.map吗?是的,是将细节映射到数组的claims.map吗?它如何匹配每个头根数组json的细节值?
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);
    });
};
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));
};