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