【问题标题】:TypeError: Cannot read property 'title' of undefined Nodejs Mysql Query resultTypeError:无法读取未定义的 Nodejs Mysql 查询结果的属性“标题”
【发布时间】:2020-10-23 14:09:27
【问题描述】:

这个错误并不总是发生,但它经常发生,我找不到任何解决方案。任何帮助将不胜感激。

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, 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)

我尝试登录

[Row : undefined]
[n : undefined]

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

【问题讨论】:

    标签: javascript mysql node.js node-modules


    【解决方案1】:

    当没有找到给定查询的记录时,可能会发生这种情况。 在这种情况下不会定义回调中的err,而是row只是一个空数组。

    由于您没有对此进行检查并直接访问row[0],这会产生undefined,因此会为n.title 引发错误。所以你应该添加以下检查:

    if(err) throw err;
    
    if (!row.length) {
       // handle error - throw or return here
    }
    // ..rest of the code
    

    【讨论】:

    • 谢谢你的回答,我试试看,会不会是查询遇到了锁超时,什么也没返回?
    • 好问题,但我认为回调中的错误将在这些情况下定义。
    • 我想我需要检查数据库是否抛出了 innodb 锁定信息,这会影响“innodb_print_lock_wait_timeout_info”吗?
    • 嗯好吧,老实说我不确定:/让我们看看..也许其他人有一个想法。对不起:/
    • 没关系,伙计,非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2017-12-13
    • 1970-01-01
    • 2021-09-12
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多