Javascript TypeError:无法读取属性';标题';未定义Nodejs Mysql查询结果的类型
这个错误并不总是发生,但它经常发生,我找不到任何解决方案。任何帮助都将不胜感激 PS:数据库中的表有“title”列,其中包含数据 代码:Javascript TypeError:无法读取属性';标题';未定义Nodejs Mysql查询结果的类型,javascript,mysql,node.js,node-modules,Javascript,Mysql,Node.js,Node Modules,这个错误并不总是发生,但它经常发生,我找不到任何解决方案。任何帮助都将不胜感激 PS:数据库中的表有“title”列,其中包含数据 代码: async function selectNotificationData(control_message_id){ const sql = await new Promise((res,rej)=>{ let query = "SELECT title, body ,url_push, img_push, url_type, st
async function selectNotificationData(control_message_id){
const sql = await new Promise((res,rej)=>{
let query = "SELECT title, body ,url_push, img_push, url_type, status,silent,channel FROM control_message WHERE id_control_message =?";
con.query(query, [control_message_id],(err,row)=>{
if(err) throw err;
let n =row[0];
let pf=null;
try{
pf = setPerFlagOptmized(n.title,n.body);
res({not_data:n,pf})
}
catch (err) {
console.log("[Row : "+row[0]+"]");
console.log("[n : "+n+"]");
console.log("ERROR IN SELECTING NOT DATA OR SETTING THE FLAG : "+err);
}
})
}).catch((error)=>{
console.log("ERROR IN SELECTING Notification DATA : "+error);
});
app_1 | /usr/src/app/node_modules/mysql/lib/protocol/Parser.js:437
app_1 | throw err; // Rethrow non-MySQL errors
app_1 | ^
app_1 |
app_1 | TypeError: Cannot read property 'title' of undefined
app_1 | at Query.con.query (/usr/src/app/v4/message/controllers/expandWorker.js:669:57)
app_1 | at Query.<anonymous> (/usr/src/app/node_modules/mysql/lib/Connection.js:526:10)
app_1 | at Query._callback (/usr/src/app/node_modules/mysql/lib/Connection.js:488:16)
app_1 | at Query.Sequence.end
(/usr/src/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
app_1 | at Query._handleFinalResultPacket
(/usr/src/app/node_modules/mysql/lib/protocol/sequences/Query.js:149:8)
app_1 | at Query.EofPacket
(/usr/src/app/node_modules/mysql/lib/protocol/sequences/Query.js:133:8)
app_1 | at Protocol._parsePacket
(/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
app_1 | at Parser._parsePacket
(/usr/src/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
app_1 | at Parser.write (/usr/src/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
app_1 | at Protocol.write (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
错误:
async function selectNotificationData(control_message_id){
const sql = await new Promise((res,rej)=>{
let query = "SELECT title, body ,url_push, img_push, url_type, status,silent,channel FROM control_message WHERE id_control_message =?";
con.query(query, [control_message_id],(err,row)=>{
if(err) throw err;
let n =row[0];
let pf=null;
try{
pf = setPerFlagOptmized(n.title,n.body);
res({not_data:n,pf})
}
catch (err) {
console.log("[Row : "+row[0]+"]");
console.log("[n : "+n+"]");
console.log("ERROR IN SELECTING NOT DATA OR SETTING THE FLAG : "+err);
}
})
}).catch((error)=>{
console.log("ERROR IN SELECTING Notification DATA : "+error);
});
app_1 | /usr/src/app/node_modules/mysql/lib/protocol/Parser.js:437
app_1 | throw err; // Rethrow non-MySQL errors
app_1 | ^
app_1 |
app_1 | TypeError: Cannot read property 'title' of undefined
app_1 | at Query.con.query (/usr/src/app/v4/message/controllers/expandWorker.js:669:57)
app_1 | at Query.<anonymous> (/usr/src/app/node_modules/mysql/lib/Connection.js:526:10)
app_1 | at Query._callback (/usr/src/app/node_modules/mysql/lib/Connection.js:488:16)
app_1 | at Query.Sequence.end
(/usr/src/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
app_1 | at Query._handleFinalResultPacket
(/usr/src/app/node_modules/mysql/lib/protocol/sequences/Query.js:149:8)
app_1 | at Query.EofPacket
(/usr/src/app/node_modules/mysql/lib/protocol/sequences/Query.js:133:8)
app_1 | at Protocol._parsePacket
(/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
app_1 | at Parser._parsePacket
(/usr/src/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
app_1 | at Parser.write (/usr/src/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
app_1 | at Protocol.write (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
setPerFlagOptmized功能:
function setPerFlagOptmized(title,body){
var t = (title.includes("|*") || title.includes("*|") || title.includes("{{") || title.includes("}}"));
var b = (body.includes("|*") || body.includes("*|") || body.includes("{{") || body.includes("}}"));
return (t || b) ? 1:0;
}
当找不到给定查询的记录时,可能会发生这种情况。 在这种情况下,回调中的
err
将不会被定义,相反row
只是一个空数组
由于您没有对此进行检查,并且直接访问行[0]
,这将产生未定义的,因此会为n.title
引发错误。因此,您应该添加以下检查:
if(err) throw err;
if (!row.length) {
// handle error - throw or return here
}
// ..rest of the code
谢谢你的回答,我会试试看,是不是查询遇到了锁超时而什么也没有返回?好问题,但我认为回调中的错误会在这些情况下被定义。我想我需要检查数据库是否抛出了innodb锁信息,这会影响“innodb\u打印\u锁\u等待\u超时\u信息”?嗯,好的,老实说,我在这里不太确定。。也许其他人有主意。对不起:/没关系,伙计,非常感谢你的帮助