簡體   English   中英

ZCCADCDEDB567ABAE643E15DCF0974E503Z 更新一個不存在的文檔

[英]Mongoose updates a document which does not exists

我有一個 function 應該根據用戶的 email 更新令牌。 The thing is, the following code returns a token even if there isn't any document with the specified email in the mongoDB database and the function return the response code 200 to my server function. 當指定的電子郵件不在數據庫中時,我想阻止更新文檔(以及任何進一步的操作),或者我想返回一些信息(無論響應代碼如何)以防止進一步的代碼執行。

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

因此,經過一系列的試驗和錯誤,我終於弄清楚了真正的問題所在。 當我直接向 mongoDB shell 發出查詢(其中 email 不在任何文檔中)時,我得到以下響應:
{ "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);
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM