1

我是 node.js 的初学者,目前正在研究 express.js 重定向例程。到目前为止,代码工作正常,会话变量正在存储并且重定向工作正常。但是一旦我打开一个新选项卡并尝试输入一个像 (127.0.0.1/login.ejs) 这样的 url,它应该重定向到 hub.ejs,如果我登录了。但在这种情况下,重定向不起作用。如果我没有登录并在新选项卡中输入例如(127.0.0.1/hub.ejs),也会出现同样的问题。重定向应该加载 login.ejs 但根本没有任何工作。页面保持空白

app.get("/login.ejs", function(req, res)
{
    if(!req.session.userName)
    {
        res.render(__dirname + "/login.ejs");
    }
    else
    {
        res.redirect(__dirname + "/hub.ejs");
    }
});

app.get("/hub.ejs", function(req, res)
{
if(req.session.userName)
{
        res.render(__dirname + "/hub.ejs", {userName: req.session.userName,     clients: clients});
    }
    else
    {
        res.redirect(__dirname + "/login.ejs");
    }
});
4

1 回答 1

0

使用以下代码:

app.use(function(req, res, next) {
    if (!req.session.userName && req.baseUrl !== 'login.ejs') {
        return res.render(__dirname + "/login.ejs");
    }
    next();
})

app.get("/login.ejs", function(req, res) {
    if(req.session.userName) {
        return res.redirect(__dirname + "/hub.ejs");
    }
    res.render(__dirname + "/login.ejs");
});

app.get("/hub.ejs", function(req, res) {
    res.render(__dirname + "/hub.ejs", {userName: req.session.userName,     clients: clients});
});

第一个功能块app.use是 express 中间件,它将针对其后定义的所有路由执行。它的作用是检查会话是否不可用并且用户没有请求登录页面(以防止重定向循环)。如果用户未登录,用户将被重定向到登录页面,否则将执行正确的路由。

对于login.ejs我们只需检查是否设置了会话并重定向到集线器。注意return防止login.ejs页面呈现的语句。

对于hub.ejs我们只是呈现该页面。如果用户没有登录,由于我们的中间件,他只会被重定向到登录页面。然后app.get("/hub.ejs"将根本不执行。

请注意,代码应按此特定顺序出现以使其工作(首先是中间件,其次是路由)。

于 2016-04-25T14:07:13.390 回答