Node.js — res.redirect не работает

Я новичок в node.js и в настоящее время работаю над процедурой перенаправления express.js. Код работает до сих пор, переменная сеанса сохраняется, и перенаправления работают нормально. Но как только я открываю новую вкладку и пытаюсь ввести URL-адрес, например (127.0.0.1/login.ejs), он должен перенаправляться на 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");
    }
});

person clyx    schedule 25.04.2016    source источник
comment
документация по перенаправлению: expressjs.com/en/api.html#res.redirect   -  person Roland Starke    schedule 25.04.2016


Ответы (1)


Используйте следующий код:

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, представляет собой специальное промежуточное ПО, которое будет выполняться для всех маршрутов, определенных после него. Что он делает, так это проверяет, недоступен ли сеанс, и пользователь не запрашивает страницу входа (чтобы предотвратить циклы перенаправления). Пользователь будет перенаправлен на страницу входа, если он не вошел в систему, в противном случае будет выполнен правильный маршрут.

Для login.ejs мы просто проверяем, установлен ли сеанс, и перенаправляем на хаб. Обратите внимание на оператор return, чтобы предотвратить рендеринг страницы login.ejs.

Для hub.ejs мы просто визуализируем эту страницу. Если пользователь не вошел в систему, он будет просто перенаправлен на страницу входа из-за нашего промежуточного программного обеспечения. Тогда app.get("/hub.ejs" просто не будет выполняться.

Обратите внимание, что код должен отображаться именно в таком порядке, чтобы он работал (сначала промежуточное ПО, потом маршруты).

person Lars de Bruijn    schedule 25.04.2016