Используя Express 4, как перенаправить на мой собственный маршрут без потери данных запроса и ответа?

У меня есть приложение, структурированное с 3 маршрутами (api, admin, default). Каждый живет в своем собственном файле, имеет собственное промежуточное программное обеспечение и экспортирует маршрут. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу перенаправить на другой маршрут, который находится на другом маршрутизаторе. По сути, я хочу вызвать одну и ту же функцию, чтобы не отображать одно и то же представление из разных мест.

Я не хочу использовать res.redirect('/someplace') пользователя, потому что я хочу иметь возможность передавать объекты req и res методу.

|-app.js
|-routes
  |---admin.js
  |---api.js
  |---default.js

Маршруты требуются и используются в app.js следующим образом.

app.use('/api', require('./routes/api')(passport);
app.use('/admin', require('./routes/admin')(passport);
app.use('/', require('./routes/default')(passport);

Внутри администратора, если есть ситуация, когда мне нужно перенаправить для входа в систему и передать некоторые данные

// authenticates all routes for the admin router
router.use(function(req, res, next){
    if(req.isAuthenticated()){
        return next();
    }
    res.flashMessage.push('Session expired'); //is lost after redirect
    res.redirect('/login');
    //do I need to restructure my whole app so that I don't
    //have to call res.redirect('login')
});

Любые идеи о том, как структурировать это? Нужно ли мне экспортировать каждый метод и хранить все мои маршруты в одном файле маршрутизатора? Это не очень чисто, но если функции находятся где-то еще, это может быть слишком грязно.


person MondayPaper    schedule 30.05.2014    source источник
comment
Если вы хотите изменить URL-адрес со стороны сервера, вам придется перенаправить их обратно и обратно (что приведет к потере req/res). Рассматривали ли вы отображение сообщения на странице входа в зависимости от того, существует ли параметр URL? Скажем, например, если пользователь переходит непосредственно к /login, он не видит сообщения, но если он перенаправляется туда, вы включаете исходный URL-адрес в качестве параметра URL-адреса и, если он существует, отображаете сообщение.   -  person dylants    schedule 31.05.2014


Ответы (1)


Вы можете перенаправить его, вызвав обратный вызов next, но только если вы не используете никаких путей.

app.use(function(req, res, next) {
    // ... api
    next();
});

app.use(function(req, res, next) {
    // ... admin
    next();
});

Другой вариант — использовать *, который будет соответствовать всем путям:

app.use("*", function(req, res, next) {
    var path = req.path; // just example how it can be done

    if (path === "/api") {
       // ...
       path = "/admin";
    }

    if (path === "/admin") {
       // ...
    }
});

Изменить:

Я не думаю, что у экспресса есть что-то вроде next('/login');, поэтому в основном функция, которая может перенаправить запрос на другой путь, и я не думаю, что это правильно иметь что-то подобное. Если клиент запрашивает /admin, вы должны отправить именно эту страницу, а не страницу под /login. Если вы хотите отправить обратно клиенту страницу входа, просто перенаправьте ее, как вы сделали это в своем вопросе. Я понимаю, что вы хотите сохранить req, res, но проблема заключается в предложении/структуре вашего веб-приложения.

person 0101    schedule 30.05.2014
comment
Я видел комментарий выше, в котором говорилось, что я могу просто передать параметр URL-адреса в перенаправлении, это самый распространенный способ получить флэш-сообщение для перенаправления? - person MondayPaper; 03.06.2014
comment
Я не совсем понимаю, что вы имеете ввиду. Если что-то вроде /login?msg=wrongPassword или /login/msg/wrongPassword, то да, я бы сказал, что это обычное дело... - person 0101; 03.06.2014