Мангуст обновляет документ, который не существует

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

У меня есть функция, которая должна обновлять токен на основе электронной почты пользователя. Дело в том, что следующий код возвращает токен, даже если в базе данных MongoDB нет никакого документа с указанным адресом электронной почты, а функция возвращает код ответа 200 моей серверной функции. Я хотел бы запретить обновление документа (и любые дальнейшие действия), когда указанного электронного письма нет в базе данных, или я хотел бы вернуть некоторую информацию (независимо от кода ответа), чтобы предотвратить дальнейшее выполнение кода.

 const vnosZetona = (req,res) =>{
    if(!req.body.ePosta ){
        return res.status(400).json({
            "sporočilo": "Epošta uporabnika manjka! Parameter je obvezen"
        });
    }
    if(!(new RegExp("[a-z]{2}[0-9]{4}@student.uni-lj.si").test(req.body.ePosta))){
        return res.status(400).json({
            "sporočilo": "Izgleda da nisi študent UL! Hm, "
        });
    }
    var generiranZeton = generirajObnovitveniZeton();
    User
    .updateOne( {email: req.body.ePosta},
                { $set: {zetonZaObnavljanjeGesla:generiranZeton}},
                (napaka) => {
                    if(napaka){
                       return res.status(400).json(napaka);
                    }else{
                        return res.status(200).json({
                            zeton : generiranZeton,
                            "sporočilo" : "Žeton uspešno dodan."
                        });
                    }         
                }
    )
  
  };
 

Ответ №1:

Итак, после серии проб и ошибок я наконец понял, что на самом деле не так. Когда я отправил запрос (с электронным письмом, которого не было ни в одном документе) непосредственно в оболочку MongoDB, я получил следующий ответ:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
Результат ясно говорит о том, что не было никакого обновления (modifiedCount равно 0), но запрос все еще выполнялся без каких-либо ошибок, поэтому мне пришлось «собрать» этот текст, а затем продолжить выполнение на основе значения «modifiedCount».

 const vnosZetona = (req,res) =>{
     //check for errors and other stuff
    var generiranZeton = generirajObnovitveniZeton(); //generate random token
     User
    .updateOne( {email: req.body.ePosta},
                { $set: {zetonZaObnavljanjeGesla:generiranZeton}},
                (napaka, sporociloQueryja) => {
                    if(napaka){
                       return res.status(400).json(napaka);
                    }else{
                        return res.status(200).json({
                            zeton : generiranZeton,
                            status: JSON.stringify(sporociloQueryja),
                            //the field "status" returns the result mentioned above 
                            //although slightly different than  in the mongoDB shell:
                            //{"n":0,"nModified":0,"ok":1}
                            "sporočilo" : "Žeton uspešno dodan."
                        });
                    }         
                }
    );
    
  };

//The following code calls the API above when we complete the form on the page and hit submit
const posljiZahtevoZaObnovoGesla = async (req,res,next) =>{
    
    //check for a valid email address 
   
    try{
        let odgovor = await axios.put(apiParametri.streznik   "/api/uporabniki/vnosZetona",{
            ePosta : req.body.ePosta
        });

        if(odgovor.status == 200){
           
            //If the query had no errors,regardless if anything was updated
            // we read the data that was returned from the API -> 
            // with a nonexistent mail, the  "odgovor.data.status" equals "{"n":0,"nModified":0,"ok":1}"
            var o = JSON.parse(odgovor.data.status);
        
            if(o.nModified == 0){
                //nothing was modified, the no document with the specified email exists
                // the user gets redirected to registration form
                return res.redirect("/registracija");
            }
            //the code sends the instructions to the specified mail that exists in database
            //using nodemailer and redirects to user sign in
            res.redirect("/prijava");
        }
        else if (odgovor.status >= 400){
            res.status(odgovor.status).json(
                {"sporocilo": "Nekaj si zafrknil! Rollbackaj na začetno stanje!"}
            );
          
        }
    }catch(napaka){
        next(napaka);
    }
};