enviando 2 mensajes flash cuando 2 consultas a la base de datos muestran que existen campos en la configuración de pasaporte

Al registrarme, reviso la base de datos para ver si el nombre de usuario y el correo electrónico existen, si existen, debería devolver un error. Todos los nombres de usuario y correos electrónicos deben ser únicos. Parece que mi problema es que solo pude obtener un error. Si el correo electrónico ya existe, recibo el mensaje flash, pero si el nombre de usuario también existe, no dice nada sobre el nombre de usuario que ya existe. Quiero mostrar ambos errores Si ambos ya existen en la publicación en un mensaje flash

Estoy asumiendo que el problema es volver done() para el correo electrónico. ya que tengo 2 consultas Solo mira la primera que fue golpeada. Realmente no lo sé.

Estaba intentando investigar sobre esto y sé que podría pasar en una matriz para req.flash, pero pude hacerlo funcionar porque está devolviendo el primero que ve que existe, creo.

También leí que el tercer parámetro de done es un objeto de información que creo que proporciona información sobre el usuario y estaba pensando en cargar la información existente allí, pero simplemente no pude armarlo. Probé otras cosas también. pero solo te mostraré lo que funciona con la consulta de la base de datos porque fallé horriblemente

 passport.use("local-signup", new LocalStrategy({ usernameField : "email", passwordField : "password", passReqToCallback : true }, function(req, email, password, done){ var arr = []; User.findOne({"email" : email}, function(err, user){ if(err) return done(err); if(user){ // arr.push("That email is already taken") return done(null, false, req.flash("signupMessage", "That username is taken")) }else{ User.findOne({"username" : req.body.username}, function(err,user){ if(err) return done(err); if(user){ // arr.push() return done(null, false, req.flash("signupMessage", "That username is taken")) }else{ var newUser = new User(); newUser.username = req.body.username; newUser.password = password; newUser.email = req.body.email; newUser.save(function(err, doc){ if(err) throw err; console.log("doc", " " , doc) return done(null, newUser); }) } }) } }) } )) 

EJS

 app.get("/signup", function(req, res){ console.log(req.session) console.log(req.flash("signupMessage")) res.render("signup", {authed : authed, user : user, message: req.flash("signupMessage")}) }) app.post("/signup",passport.authenticate("local-signup", { successRedirect : "/", failureRedirect : "/signup", failureFlash : true })) 

Este es un problema de flujo de control básico. Su regreso No lo hagas Tendrá que repetir parte del código como una funcionalidad adicional, o usar una bandera y golpear el db antes. Tampoco está seguro de cómo mostrar ambos mensajes, tendrá que resolverlo por separado. Combínelos en uno (“El nombre de usuario y el correo electrónico ya están registrados. Ingrese un nombre de usuario y una ID de correo electrónico diferentes.”)

 User.findOne({"email" : email}, function(err, user){ if(err) return done(err); if(user){ // arr.push("That email is already taken") // do not know what all done does maybe a ligther versio that just sends the error done(null, false, req.flash("signupMessage", "That Email is taken")) User.findOne({"username" : req.body.username}, function(err,user){ if(err) return done(err); if(user){ // arr.push() return done(null, false, req.flash("signupMessage", "That username is taken")) }//no else here return; }else{ User.findOne({"username" : req.body.username}, function(err,user){ if(err) return done(err); if(user){ // arr.push() return done(null, false, req.flash("signupMessage", "That username is taken")) }else{ var newUser = new User(); newUser.username = req.body.username; newUser.password = password; newUser.email = req.body.email; newUser.save(function(err, doc){ if(err) throw err; console.log("doc", " " , doc) return done(null, newUser); }) } }) } }) } )) 

Ajustar el flujo de control es una forma de resolver esto, pero si está buscando una solución más elegante, puede probar la forma de promise.all() .

Lo que hace la promise.all() es que en realidad dispara todas las llamadas asíncronas a la vez y regresa cuando;

  1. Todas las llamadas asíncronas tienen éxito (resuelve)
  2. Cualquier 1 de las llamadas asíncronas devuelve con rechazar (falla)

Obviamente, el punto 2 no es algo que está buscando, ya que desea informar el correo electrónico y el nombre de usuario juntos para una situación en la que no son únicos.

Para solucionar esto, tendrá que usar reflect para hacer la promise.all() devuelven solo cuando todas las promesas han respondido (éxito o falla).

Considere el siguiente código:

 this.reflect = function reflect(promise){ return promise.then(function(/*resolve return value=*/v){ return { v:v, status: "resolved" }}, function(/*rejection error=*/e){ return { e:e, status: "rejected" }}); }; var promises = [ new Promise(function(resolve, reject) { // User.findOne({"username" : req.body.username}, function(err,user){ // if (err) { return reject("error!"); }... // resolve("Name is unique!!"); // }); resolve("name is unique"); }), new Promise(function(resolve, reject) { reject("email is NOT unique"); }) ]; Promise.all(promises.map(this.reflect)).then(function(results) { if (results[0].status === "rejected") { console.log("Error reason: " + results[0].e); } else { console.log("Succeeds, reason: " + results[0].v); } if (results[1].status === "rejected") { console.log("Error reason: " + results[1].e); } else { console.log("Succeeds, reason: " + results[1].v); } // You can call whatever callback you want here. // eg return done(null, "Test"); }); 

Salida:

Tiene éxito, razón: el nombre es único
Razón del error: el correo electrónico NO es único

Nota: debe poder realizar algunas modificaciones en el código anterior para satisfacer sus necesidades. Dame un grito si sigues teniendo problemas.

Referencia:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

Intentalo:

  var signupMessages = []; User.findOne({"email" : email}, function(err, user){ if(err) return done(err); if(user) signupMessages.push("That email is taken"); User.findOne({"username" : req.body.username}, function(err,user){ if(err) return done(err); if(user) signupMessages.push("That username is taken"); if(signupMessages.length > 0){ return done(null, false, req.flash("signupMessage", signupMessages)); } else { ... 

En este caso, req.flash("signupMessage") devolverá una matriz de mensajes

    Intereting Posts