Nodejs未处理的承诺拒绝警告类型错误无法读取属性错误处理?

时间:2019-08-29 13:59:02

标签: node.js

我是nodejs的初学者。我有一个使用async方法的函数,该函数读取JSON值并更新到数据库。但是这里的问题是,有时我在读取该函数中的JSON值时得到unhandledpromiserejectionwarning typeerror cannot read property

下面是示例代码段:

proto.onWspresenceEvent = function (json_obj , cb){

    try{

       (async () => {


            var self = this;

            let event_state = 0;

            let id    = json_obj["SCA"].id; //here getting the error


        })();
     }
    catch(e){
    }
}

3 个答案:

答案 0 :(得分:0)

未处理的承诺拒绝警告是由于代码的语法错误引起的。您可以尝试这样做可能会解决您的问题

 proto.onWspresenceEvent = async (json_obj , cb)=>{

    try{

       await () => {


            var self = this;

            let event_state = 0;

            let id    = json_obj["SCA"].id; //here getting the error


        })();
     }
    catch(e){
    }
    }

答案 1 :(得分:0)

在最新版本的节点中,您已经要处理被拒绝的承诺,也可以使用.catch短语。

您的诺言在哪里?异步函数总是返回一个承诺。即使您编写了函数,也无法拒绝它-您必须放置一个.catch短语。

注释catch之后的try没有资格作为承诺拒绝处理程序。您必须将.catch放在您的承诺之后,例如:

proto.onWspresenceEvent = function (json_obj , cb){
    try{
       (async () => {
            var self = this;
            let event_state = 0;
            let id    = json_obj["SCA"].id; //here getting the error
            cb("sucess")
        })()
        .catch(reason) { // your error handling
        }
     }
    catch(e){
           cb("failed")
    }
}

当您的json文件不包含您尝试读取的属性时,可能会导致该错误,因此会引发错误。由于此错误位于异步函数内部,因此会拒绝带有该错误的promise,但是该特定promise没有错误处理,因此会因该错误而失败。

答案 2 :(得分:0)

function yourFunc(json_obj , cb){
    try {
       (() => {
            var self = this;
            let event_state = 0;
            let id  = json_obj["SCA"].id;
            cb("sucess")
        })();
    } catch(e){
        cb("failed")
    }
}

yourFunc({ SCA: { id: 123 } }, console.log) // success

yourFunc(null, console.log) // failed

// can be rewritten more clearly as follow

function yourFuncClear(json_obj , cb){
    try {
        let id  = json_obj["SCA"].id;
        cb("sucess")
    } catch (e){
        cb("failed")
    }
}

yourFuncClear({ SCA: { id: 123 } }, console.log) // success

yourFuncClear(null, console.log) // failed