Tengo las siguientes dos funciones de middleware:
function validateEmail(req, res, next) { console.log('email validation'); if (req.body.email && req.body.email.match(EMAIL_REGEX)) { console.log('email OK!'); return next(req, res); } else { console.log('email wrong'); res.json({ message: 'email invalid'}); } } function validateOriginHeader(req, res, next) { if (ORIGIN_WHITELIST.includes(req.headers.origin)) { console.log('header OK!'); return next(req, res); } else { console.log('header wrong!'); res.status(403); res.end('game over'); } } Intento usarlos en la configuración de próxima conexión en pages/api , donde defino las opciones onError y onNoMatch:
// factory fn returns new instance of newConnect with default setup function factory() { return nextConnect({ onError(err, req, res) { console.log('error?:', Object.keys(err)); res.status(500).json({ message: 'Internal Server Error' }); }, onNoMatch(req, res) { res.status(405).json({ message: `Method ${req.method} is not allowed.` }); }, }); } // pages/api/subscribe.js export default factory() .use(validateOriginHeader) .use(validateEmail) .post(async (req, res) => { try { const mailchimpRes = await mailchimp.subscribe(req.body); res.json(mailchimpRes); } catch (e) { res.json(e); } });El problema:
Solo se ejecuta el primer middleware (imprimiendo 'header OK!' en la consola del servidor). La consola en validateEmail nunca se imprime. Cuando consuelo erro en el controlador onError definido en las opciones de próxima conexión, parece un objeto de solicitud, es decir. contiene el cuerpo con la carga del correo electrónico.
Llamar a la ruta da como resultado 500: se devuelve un error interno del servidor (como se define en el controlador onError).
¿Qué tiene de malo esta configuración?
versiones utilizadas:
"siguiente": "11.1.2" "siguiente conexión": "0.10.2"
Tienes que llamar a next() con argumentos vacíos en lugar de next(req, res) . Llamar a next() con un parámetro (s) da como resultado onError