Javascript 如何在node.js中循环SQL数据库时正确创建嵌套json数组?
以下是我试图实现的目标,我将创建如下数组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
[{
"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));
};