我正在从PHP迁移到NodeJS,我试图理解为什么中间件重定向失控。
// Check to see if the request includes a session Username
app.use(function (req, res, next) {
sessionmanager = req.session;
if(sessionmanager.Username) {
console.log('Session Details detected');
next();
} else {
console.log('No session details detected, pushing user to login page');
res.redirect('/login');
}
});
// User Landing Page
app.get('/', function (req, res) {
console.log('Request for landing page');
res.send('Welcome Page!');
});
// User Login Page
app.get('/login', function (req, res) {
console.log('Request for User login page');
res.sendFile(path.join(__dirname, './public', 'login.html'));
});
当我访问localhost:3000时,它会将我重定向到localhost:3000 / login,但该页面无法加载,因为它看起来好像被重定向了太多次。 当我查看控制台日志时,我可以算数; 20多行消息'未检测到会话详细信息,将用户推送到登录页面'。
根据我的猜测,重定向循环回到app.use函数,无法传递会话manager.Username语句并陷入循环。 什么是将流量重定向到/登录页面的最佳方法?我可以在app.use中添加一个exclude子句吗?
答案 0 :(得分:1)
阅读文档:https://expressjs.com/en/guide/using-middleware.html 您可以设置请求,以便/ app在app.use之前出现,这不是重定向循环的一部分。 示例:
// User Login Page
app.get('/login', function (req, res) {
console.log('Request for User login page');
res.sendFile(path.join(__dirname, './public', 'login.html'));
});
// Check to see if the request includes a session Username
app.use(function (req, res, next) {
sessionmanager = req.session;
if(sessionmanager.Username) {
console.log('Session Details detected');
next();
} else {
console.log('No session details detected, pushing user to login page');
res.redirect('/login');
//res.sendFile(path.join(__dirname, './public', 'login.html'));
}
});
// User Landing Page
app.get('/', function (req, res) {
console.log('Request for landing page');
res.send('Welcome Page!');
});
现在您可以向/ login网址发出请求,如果您还没有登录会话,那么经过app.use的任何网页都会将您推回到登录页面。
答案 1 :(得分:0)
您的登录路由位于中间件下方。它应该是你的路线列表顶部像这样
// User Login Page
app.get('/login', function (req, res) {
console.log('Request for User login page');
res.sendFile(path.join(__dirname, './public', 'login.html'));
});
// Check to see if the request includes a session Username
app.use(function (req, res, next) {
sessionmanager = req.session;
if(sessionmanager.Username) {
console.log('Session Details detected');
next();
} else {
console.log('No session details detected, pushing user to login page');
res.redirect('/login');
}
});
// User Landing Page
app.get('/', function (req, res) {
console.log('Request for landing page');
res.send('Welcome Page!');
});
希望你理解