Express-js中间件未按预期工作。它显示了太多重定向。当我删除令牌或注销时,它在浏览器中显示有太多的重定向
中间件
const isAuthenticate = async (req, res, next) => {
const token = req.cookies.jwt;
if (token) {
jwt.verify(token, "thisisjwtsecret", async (err, token_decode) => {
if (!err) {
const u_id = token_decode._id;
const userData = await User.findOne({ _id: u_id });
req.user = userData;
req.isAuth = true;
next();
} else {
res.redirect("/user/login");
}
});
} else {
res.redirect("/user/login");
}
};
Route.js
// Auth Controller
const AuthController = require("../../controllers/auth/AuthController");
const { isAuthenticate } = require("../../middlewares/isAutheticated");
router.get("/user/login", isAuthenticate, AuthController.login);
router.post("/user/login", AuthController.checkLogin);
router.get("/user/register", isAuthenticate, AuthController.createUser);
router.post("/user/register", isAuthenticate, AuthController.storeUser);
module.exports = router;
LOgin功能
// Showing Login Page to User
const login = (req, res) => {
return res.render("auth/login");
};
当我删除令牌或注销时,它在浏览器中显示有太多的重定向
现在您已经显示了isAuthenticate()
的修订代码,重定向循环是由该代码中的重定向引起的。情况如下:
使用isAuthenticate
作为路由中间件的某个路由(任何路由(检测到用户未登录。然后重定向到/user/login
。到目前为止还可以。然后,浏览器发出一个新的/user/login
请求,并将您带到这个路由定义:
router.get("/user/login", isAuthenticate, AuthController.login);
但是,该路由定义再次运行重定向到/user/login
的isAuthenticate()
中间件,因此您有一个无限的重定向循环。
可能您只需要从此路由中删除isAuthenticate()
检查。如果用户已经转到/user/login
页面,则不需要检查他们的身份验证或重定向他们。如果你有理由想知道他们是否经过了身份验证,那么你需要一个单独的版本,只进行身份验证检查,不重定向,你可以在/user/login
路由定义中使用它。
显示执行res.redirect((的代码之前的原始答案。
因此,您展示的这个中间件将req.isAuth
设置为true
或false
,然后调用next()
继续路由。通过该中间件的所有三条代码路径都只设置req.isAuth
,然后调用next()
。在这个中间件中,没有任何地方可以进行重定向。因此,如果核心问题是重定向过多,那么这个问题一定是由其他实际执行重定向的路由/中间件在其他地方引起的,可能是当它看到req.isAuth
是false
时,因为您说过问题发生在注销或令牌丢失时。
重定向时,您必须确保当您重定向到某个URL时,该URL的路由处理程序也重定向到该URL的可能性为零(没有任何类型的代码路径(。这就是进入重定向循环的方式。
查看您显示的其他路由,如果重定向到/user/login
时出现了重定向过多的问题,那么问题可能出现在该路由的authController.login()
处理程序中:
router.get("/user/login", isAuthenticate, AuthController.login);
如果该路由的代码检查req.isAuth
并在任何情况下重定向,那么这将是一个无休止的重定向循环。
如果您需要进一步的建议,请提供以下信息:
- 哪个确切的重定向URL会导致重定向过多的问题?是
/user/login
吗 - 向我们显示执行重定向的路由的代码,因为这显然是故障所在