Esto está directamente fuera de la documentación express-validator . Noté que cuando estas funciones se pasan como middleware, incluyen argumentos y paréntesis, en cuyo caso deberían llamarse en tiempo de ejecución, ¿no?
// ...rest of the initial code omitted for simplicity. const { body, validationResult } = require('express-validator'); app.post( '/user', // username must be an email body('username').isEmail(), // password must be at least 5 chars long body('password').isLength({ min: 5 }), (req, res) => { // Finds the validation errors in this request and wraps them in an object with handy functions const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } User.create({ username: req.body.username, password: req.body.password, }).then(user => res.json(user)); }, );Salté al código fuente para tratar de averiguar cómo están impidiendo las llamadas a funciones, pero es un poco por encima de mi cabeza. La razón por la que quería aprender sobre esto era que estaba interesado en crear un middleware que funcionara de manera similar, donde los argumentos pudieran pasarse sin llamar a la función en tiempo de ejecución.
No voy a aplicar ingeniería inversa a un código específico, pero explicaré cómo lograr esto en general.
Consulte la documentación de middleware como referencia.
Un punto final es una función que toma dos argumentos. La petición y la respuesta. Por lo general, se denominan req y res .
El middleware toma tres argumentos. El tercero es el next , que se llama para pasar el control a la siguiente función.
app.use(function (req, res, next) { console.log('Time:', Date.now()) next() })
Ahora, el middleware no tiene que pasar el control a la siguiente función. Solo puede responder.
const middleware = (req, res, next) => { if (typeof req.body?.username === 'undefined') { // No username was provided res.send("Error: No username was provided"); } else { next(); } } Ahora, es posible que desee que esto sea reutilizable para argumentos que no sean el nombre de username , de modo que pueda escribir una función de fábrica que devuelva la función de middleware.
const createMiddleware = (propertyName) => { const middleware = (req, res, next) => { if (typeof req.body?.[propertyName] === 'undefined') { // No value was provided for the propertyName res.send(`Error: No ${propertyName} was provided`); } else { next(); } } return middleware; }Y luego úsalo:
app.use( createMiddleware('username') ); app.use( createMiddleware('password') );