Estoy desarrollando mi propio sitio web usando (angularjs, bootstrap) para el front-end (node, express) para el back-end (mongodb, mongoose layer) para la base de datos.
Tengo un formulario de registro y en ese formulario quiero verificar que el correo electrónico no se haya tomado cuando alguien intente crear una nueva cuenta, por lo que quiero que mi API de registro verifique si el correo electrónico enviado no se ha tomado antes.
Ahora estoy usando este validador https://github.com/ctavan/express-validator#validation-by-schema y este es mi código:
var vadlidateRegUser= function (req,res,next) { req.checkQuery('UserName','Username must contain letters and numbers only').isAlphanumeric().notEmpty(); req.checkQuery('Email','Email should have a valid syntax eg: example@example.com') .isEmail().notEmpty(); var error = req.validationErrors(); if(!error){ next(); }else { res.json({success:false, message:error}); } }Ahora me gustaría verificar con el validador si el correo electrónico es único, algo como esto:
req.checkQuery('Email','Email should have a valid syntax eg: example@example.com') .isEmail().isUnique(Model Name);alguna sugerencia ?
express-validator puede verificar y desinfectar sus datos de entrada, pero no puede saber si un correo electrónico ya está en su base de datos.
Creo que la mejor manera es hacerlo unique en su esquema de mongoose y manejar el error cuando ya existe un correo electrónico:
let User = new Schema({ firstname: String, lastname: String, email: { type: String, required: true, unique: true, // ensure unique email validate: [ isEmail, "Email should have a valid syntax eg: example@example.com" ] }, // ... })Sé que esta pregunta es antigua pero la encontré hoy con la esperanza de ayudarme con el mismo problema, pero logré encontrar la manera de hacerlo, así que quería compartirla para que la siguiente la encuentre.
Ahora express-validator tiene la capacidad de verificar con Promises.
Lo que hice fue crear un archivo separado con mi esquema de mangosta y solicitarlo en mi enrutador, luego durante mis comprobaciones hice esto:
check('email').custom((value) => { var query = User.find({ email: value}) return query.exec().then(user => { if (user.length > 0) { return Promise.reject('E-mail already in use'); } }); }),y todo funciona a las mil maravillas!
Espero que esto ayude a alguien más. Si necesita más detalles, solo responda para que pueda agregar más detalles.