Обработка ошибок для данных, возвращаемых из Mongo Query - PullRequest
0 голосов
/ 27 мая 2018

Все еще относительный новичок, но я использую портал, чтобы позволить людям проверять, является ли человек членом клуба.Я использую mongodb и mongoose для этого, однако, когда вводится число, которого нет в базе данных, возвращается ошибка «TypeError: Не удается прочитать свойство 'username' of undefined" достаточно справедливо, но я не уверен, какЧтобы справиться с этой ошибкой, пожалуйста, посмотрите мой код ниже: я знаю, что есть несколько способов, которыми я могу реорганизовать и привести в порядок свой код, но это обработка ошибок Мангуста, о которой я хотел бы знать.Приветствия ?

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

при вводе числа, которого нет в базе данных, возвращается ошибка "Ошибка типа: невозможно прочитать свойство '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
      },
    });

  });
});
0 голосов
/ 27 мая 2018

Вам необходимо проверить, не является ли полученный массив не пустым:

Вот что вы можете попробовать:

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");
                }
           }
       });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...