typescript - .bail() no funciona con express-validator
Estoy registrando un usuario. Necesito un name, email y un password. Cuando no se proporciona un name, el backend no necesita verificar si el correo electrónico es válido.
Hasta donde sé, aquí es donde entra la funcionalidad .bail() de express-validator. Desafortunadamente, esta funcionalidad no hace nada en mi caso, todas las validaciones se ejecutan de todos modos.
La ruta: app.post('/register', validate(createUserSchema), createUser);
La función validate():
export const validate = (schemas: ValidationChain[]) => async (req: Request, res: Response, next: NextFunction) => {
await Promise.all(schemas.map(async (schema) => await schema.run(req)));
const result = validationResult(req);
if (result.isEmpty()) {
return next();
}
const errors = result.array();
return res.status(422).json(errors);
};
El createUserSchema:
export const createUserSchema = [
body('name', 'Name is required').notEmpty().bail(),
body('email', 'Email is required').notEmpty().bail(),
body('email').isEmail().withMessage('Email is not valid').bail(),
body('email')
.custom((value) => {
if (!value) return true;
return prisma.user
.findUnique({
where: {
email: value
}
})
.then(async (user) => {
if (user) {
return await Promise.reject(new Error('E-mail already in use'));
}
return await Promise.resolve();
});
}).bail(),
body('password', 'Password is required').notEmpty().bail()
.isLength({min: 6}).withMessage('Password must be longer than 6 characters')
.matches(/[A-Z]/).withMessage('Password does not contain an uppercase character')
.matches(/\W/).withMessage('Password does not contain any non-word characters')
];
mi carga de solicitud:
{
name: "",
email: "",
password: ""
}
La respuesta que recibo:
[
{
"value":"",
"msg":"Name is required",
"param":"name",
"location":"body"
},
{
"value":"",
"msg":"Email is required",
"param":"email",
"location":"body"
},
{
"value":"",
"msg":"Email is not valid",
"param":"email",
"location":"body"
},
{
"value":"",
"msg":"Password is required",
"param":"password",
"location":"body"
}
]
La respuesta que espero (porque debería fallar en la primera validación):
[
{
"value":"",
"msg":"Name is required",
"param":"name",
"location":"body"
}
]
¿Estoy haciendo algo mal?
Respuesta #1
Aquí para responder mi propia pregunta -_-
Así que entendí mal lo que es una Validation Chain en express-validator.
Tenía la impresión de que diferentes filas de validación formaban una cadena de validación (así que un array formaría una cadena). Esto no es así. Una cadena se forma por las reglas de validación separadas.
Por ejemplo
export const createUserSchema = [
body('name').notEmpty().withMessage('Name is required').bail(), //<--- this is a validation chain
body('email').notEmpty().withMessage('Email is required').bail()
.isEmail().withMessage('Email is not valid').bail()
]; // <--- The whole array does not form a chain (which is what I thought)
Gustavo Henke lo explicó aquí.
Entonces, para lograr lo que quiero, necesitaba usar la validación .if(condition).
