【问题标题】:Error handling for data returned from Mongo Query从 Mongo Query 返回的数据的错误处理
【发布时间】:2018-05-27 18:11:50
【问题描述】:

仍然是一个相对新手,但我正在使用门户网站让人们检查一个人是否是俱乐部的成员。我正在使用 mongodb 和 mongoose 来执行此操作,但是当输入不在数据库中的数字时,会返回错误“TypeError:无法读取未定义的属性'用户名'”,但我不确定如何要处理此错误,请参阅下面的代码:我知道有几种方法可以重构和整理我的代码,但这是我想知道的猫鼬错误处理。干杯????

app.get('/checkmembership', function(req, res) {

    var jsonResponse = {};
    var returnArray =[];

    var dbArray,
        queryArray,
        resulta,
        resultb,
        resultc,
        resultd,
        resulte,
        resultf;

    console.log("before running compareDetails " + returnArray);

    User.find({username: req.query.memberIdQuery}, function(err, foundData) {

        if(err){
            console.log(err);
        } else {
            dbArray = [foundData[0].username, foundData[0].emailaddress, foundData[0].surname];
            console.log(dbArray);
            dbArray = dbArray.join('|').toLowerCase().split('|');
            console.log(dbArray);
            queryArray = [req.query.memberIdQuery, req.query.emailQuery, req.query.surnameQuery];
            console.log(queryArray);
            queryArray = queryArray.join('|').toLowerCase().split('|');
            console.log(queryArray);
            returnArray = compareDetails(queryArray, dbArray);
            resulta = returnArray[0];
            resultb = returnArray[1];
            resultc = returnArray[2];
            resultd = returnArray[3];
            resulte = returnArray[4];
            resultf = returnArray[5];
        }

        jsonResponse = { 
            set_attributes: 
            {
                resulta : resulta,
                resultb : resultb,
                resultc : resultc,
                resultd : resultd,
                resulte : resulte,
                resultf : resultf
            },
        };

        res.send(jsonResponse);
    });
});

【问题讨论】:

    标签: javascript node.js mongodb mongoose error-handling


    【解决方案1】:

    你需要检查你得到的数组是否不为空:

    您可以尝试以下方法:

    app.get('/checkmembership', function(req, res) {
        var jsonResponse = {};
        var returnArray =[];
        var dbArray,
            queryArray,
            resulta,
            resultb,
            resultc,
            resultd,
            resulte,
            resultf;
    
        console.log("before running compareDetails " + returnArray);  
            User.find({username:req.query.memberIdQuery}, function(err, foundData){
                if(err){
                   console.log(err);
               } else {
    
                if(foundData && foundData.length) {
    
                dbArray = [foundData[0].username,foundData[0].emailaddress,foundData[0].surname];
                console.log(dbArray);
                dbArray = dbArray.join('|').toLowerCase().split('|');
                console.log(dbArray);
                queryArray = [req.query.memberIdQuery,req.query.emailQuery,req.query.surnameQuery];
                console.log(queryArray);
                queryArray = queryArray.join('|').toLowerCase().split('|');
                console.log(queryArray);
                returnArray = compareDetails(queryArray, dbArray);
                resulta = returnArray[0];
                resultb = returnArray[1];
                resultc = returnArray[2];
                resultd = returnArray[3];
                resulte = returnArray[4];
                resultf = returnArray[5];
    
    
                jsonResponse = { 
                    set_attributes: 
                      {
                          resulta : resulta,
                          resultb : resultb,
                          resultc : resultc,
                          resultd : resultd,
                          resulte : resulte,
                          resultf : resultf
                      },
                      };
                     res.send(jsonResponse);
                    } else {
                        res.send("Empty result");
                    }
               }
           });
    });
    

    【讨论】:

    • 感谢 Jack 船长,也做得很好,当我看到你的评论时,我打了自己一巴掌,这太有道理了,不敢相信我没有想到。
    • 别担心,给它一些时间,你会做得更好!!万事如意!
    【解决方案2】:

    当输入一个不在数据库中的数字时,返回错误“TypeError: Cannot read property 'username' of undefined”

    这是因为默认情况下,当没有匹配记录时foundData 将是一个空数组[]。所以, foundData[0],技术上将是undefined

    执行查询时,结果将是一个文档数组。

    来源 mongoose docs

    为避免此错误,您可以在访问 foundData 的第 0 个元素之前检查它的大小。

    对您的代码进行这些更改。

    app.get('/checkmembership', function (req, res) {
    
      let {memberIdQuery, emailQuery, surnameQuery} = req.query;
    
      User.find({
        username: memberIdQuery
      }, function (err, foundData) {
    
        if (err) {
          console.log(err);
          return res.status(500).send({
            msg: `memberIdQuery = ${memberIdQuery} doesnt exist`
          });
        }
    
        if (!foundData || foundData.length === 0) {
          return res.status(200).send({
            msg: `No records found for memberIdQuery = ${memberIdQuery}`
          });
        }
    
        let dbArray = [
          foundData[0].username,
          foundData[0].emailaddress,
          foundData[0].surname
        ];
        dbArray = dbArray.join('|').toLowerCase().split('|');
    
        let queryArray = [
          memberIdQuery,
          emailQuery,
          surnameQuery
        ];
        queryArray = queryArray.join('|').toLowerCase().split('|');
    
        let [resulta, resultb, resultc, resultd, resulte, resultf] = compareDetails(queryArray, dbArray);
    
        return res.send({
          set_attributes: {
            resulta: resulta,
            resultb: resultb,
            resultc: resultc,
            resultd: resultd,
            resulte: resulte,
            resultf: resultf
          },
        });
    
      });
    });
    

    【讨论】:

    • 感谢 Sridhar 工作得非常好,并且还处理了我今天早上计划进行的许多重构 ?
    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2022-10-07
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多