Cuerpo de solicitud de acceso en la función de verificación del validador expreso v4

Acabo de comenzar a usar Express.js con Express-Validator para validar algunos datos de entrada y tengo problemas para acceder al cuerpo de solicitud en la nueva API de verificación que se introdujo en la versión 4.0.0.

En versiones anteriores, simplemente agregaba Express-Validator como middleware en tu app.js en algún lugar después del analizador corporal:

// ./app.js const bodyParser = require("body-parser"); const expressValidator = require("express-validator"); const index = require("./routes/index"); const app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(expressValidator()); 

Luego, en mi ruta de índice, pude verificar los campos en la función de callback final del método posterior.

 // ./routes/index.js const express = require("express"); const router = express.Router(); router.post("/submit", (req, res, next) => { // check email req.check('email','Invalid email address').isEmail() // check if password is equal to password confirmation req.check('password', 'Invalid password') /* Access request body to compare password field with password confirmation field */ .equals(req.body.confirmPassword) // get errors const errors = req.validationErrors(); // do stuff }); 

Como en este ejemplo, podría comprobar fácilmente si los valores de mi campo de contraseña y el campo de confirmación de contraseña de mi formulario son iguales. Sin embargo, desde la versión 4, tienen una nueva API que requiere que cargue el validador expreso directamente en su archivo de enrutador y que pase las funciones de verificación como una serie de funciones antes de la callback final en el método posterior, como esto:

 // ./routes/index.js const express = require("express"); const router = express.Router(); const { check, validationResult } = require("express-validator/check"); router.post( "/submit", [ // Check validity check("email", "Invalid email").isEmail(), // Does not work since req is not defined check("password", "invalid password").isLength({ min: 4 }) .equals(req.body.confirmPassword) // throws an error ], (req, res, next) => { // return validation results const errors = validationResult(req); // do stuff }); 

Esto no funciona ya que no se define req. Así que mi pregunta es: ¿cómo puedo acceder al objeto de solicitud en una cadena check() para comparar dos campos diferentes con la nueva API de validación rápida? Muchas gracias de antemano!

Después de juguetear por un tiempo, encontré una manera de lograrlo usando validadores personalizados. La función de validación pasada al método personalizado acepta un objeto que contiene el cuerpo de la solicitud:

 router.post( "/submit", [ // Check validity check("email", "Invalid email").isEmail(), check("password", "invalid password") .isLength({ min: 4 }) .custom((value,{req, loc, path}) => { if (value !== req.body.confirmPassword) { // trow error if passwords do not match throw new Error("Passwords don't match"); } else { return value; } }) ], (req, res, next) => { // return validation results const errors = validationResult(req); // do stuff });