繁体   English   中英

Express res.redirect 重定向未按预期工作

[英]Express res.redirect redirect not working as expected

我有一个快速应用程序。 我正在添加一个中间件,如果令牌无效,它会将用户重定向到注销。

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);
    }
}

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),
    });
};

我像这样在我的路线中使用这个中间件。 来自客户端的所有 api 请求都通过以下路线:

router.use('/api', validateAuthTokenMiddleware, graphql);

但是重定向没有按预期工作。

  • 我希望我的浏览器在清除 cookie 后重定向到我的“/登录”路由/页面。 相反,我的/api调用只看到 401,并且浏览器仍然在同一页面上。 res.redirect(302, '/login') 没有被触发。
  • 我尝试重构logoutUser只发送res.redirect(302, '/login')而不是 res.json。 还是不行。

在浏览器上观察到的网络快照: 在此处输入图像描述

我的浏览器发出简单的请求

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,...

这意味着application/json是可接受的(因为*/*;q=0.8 ),因此选择了您的 json 响应,这不是重定向。 也许重新排序res.format中的选择会有所帮助。

你写了:

我尝试重构 logoutUser 只发送 res.redirect(302, '/login') 而不是 res.json。 还是不行。

您也可以分享您的重构代码吗?

我最终为我的客户代码设置了一个条件。 如果收到 401,则重定向到登录页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM