首先,我对node/JSON很陌生,所以在通读时请考虑这一点。
此代码的目的是从 SQL Server 数据库中获取数据,并能够访问它提取的元素。例如,它将提取数千个父帐户ID,而我只想访问其中一个。
我几乎整天都在浏览论坛,试图从我的nodejs函数访问JSON元素,每次我尝试访问其中一个元素时,我都会遇到"未定义"错误。作为最后的手段,我在这里。
我已经检查了几次以查看记录集已被解析,并且似乎正在解析它。
下面是我的代码,最后是 JSON 代码的一个非常小的示例。
我已经评论了我在哪里得到我的错误。
function getEmp() {
var conn = new sql.ConnectionPool(dbConfig);
var req = new sql.Request(conn);
conn.connect(function (err) {
if (err) {
console.log(err);
return;
}
req.query("SELECT * FROM parentaccount Where accountname like 'Titan%' FOR JSON PATH", function (err, recordset) {
if (err) {
console.log(err);
}
else {
const Test1 = recordset[0].ParentAccountId; //error here
console.log(Test1);
}
conn.close();
})
})
}
getEmp();
//EXAMPLE JSON
{ recordsets: [ [ [Object] ] ],
recordset:
[ { 'JSON_F52E2B61-18A1-11d1-B105-00805F49916B':
'[{"ParentAccountId":4241411,"AccountName":"Titan"} ],
output: {},
rowsAffected: [ 3 ] }
ERROR:
TypeError: Cannot read property 'ParentAccountId' of undefined
at C:Usersza47387DesktopExcel Export Codetest2.js:31:48
at _query (C:Usersza47387node_modulesmssqllibbase.js:1347:9)
at Request.tds.Request.err [as userCallback] (C:Usersza47387node_modulesmssqllibtedious.js:671:15)
at Request.callback (C:Usersza47387node_modulestediouslibrequest.js:37:27)
at Connection.endOfMessageMarkerReceived (C:Usersza47387node_modulestediouslibconnection.js:2104:20)
at Connection.dispatchEvent (C:Usersza47387node_modulestediouslibconnection.js:1084:36)
at Parser.tokenStreamParser.on (C:Usersza47387node_modulestediouslibconnection.js:914:14)
at Parser.emit (events.js:189:13)
at Parser.parser.on.token (C:Usersza47387node_modulestediouslibtokentoken-stream-parser.js:27:14)
at Parser.emit (events.js:189:13)
从您共享的示例来看,
记录集[0] 是未定义的,这意味着两个选项之一:
a( 查询的结果未提取任何行。b( 查询结果的格式与预期不同。
虽然我怀疑 a(,但控制台输出很好。请在尝试访问父帐户ID之前运行以下代码。
console.log('output : ', JSON.stringify(recordset, null, 4));
我也会将代码重构为:
const Test1 = (Array.isArray(recordset) &&
recordset.length) ? recordset[0].ParentAccountId : null;
这样错误就不会使 NodeJS 进程出现故障。