Tengo una aplicación express. Estoy agregando un middleware que redirige al usuario a cerrar sesión si el token no es válido .
export async function validateAuthTokenMiddleware( req: Request, res: Response, next: NextFunction, ): Promise<NextFunction | void> { try { const { context } = req; await validateToken(context); next(); } catch (err) { logoutAndRedirectUser(res); } } Código para cerrar sesión y logoutAndRedirectUser
const logoutUser = (res: Response) => { res.clearCookie('my_token') res.format({ json: () => res.status(401).json({ errors: [ { message: 'You must login to see this', errorCode: '0001', }, ], extensions: { location: location, }, }), html: () => res.redirect(302, location), default: () => res.redirect(302, location), }); };Estoy usando este middleware en mi ruta así. Todas las solicitudes de API del cliente pasan por esta ruta:
router.use('/api', validateAuthTokenMiddleware, graphql);Sin embargo, la redirección no funciona como se esperaba.
/api y el navegador permanece en la misma página. res.redirect(302, '/login') no se activa.logoutUser para enviar simplemente res.redirect(302, '/login') en lugar de res.json. Todavía no funciona.Mi navegador hace solicitudes simples con
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,... Esto significa que application/json es aceptable (debido a */*;q=0.8 ), por lo tanto, se elige su respuesta json, que no es una redirección. Tal vez ayude reordenar las opciones dentro de res.format .
Tu escribiste:
He intentado refactorizar logoutUser para enviar simplemente res.redirect(302, '/login') en lugar de res.json. Todavía no funciona.
¿Puedes compartir tu código refactorizado también, por favor?
Termino estableciendo una condición en mi código de cliente. Si recibió 401, redirija a la página de inicio de sesión.