Возврат ответа о перенаправлении вместо ожидаемого представления листа - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть обработчик маршрута, который возвращает Future для моей страницы входа, определенный следующим образом:

func boot(router: Router) throws {
    let authSessionRoutes = router.grouped(User.authSessionsMiddleware())
    authSessionRoutes.get("/login", use: loginHandler)
}

func loginHandler(_ req: Request) throws -> Future<View> {
    return try req.view().render("loginPage")
}

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

Вот что я попробовал:

func loginHandler(_ req: Request) throws -> Future<View> {

    if let _ = try req.authenticated(User.self) {
        return req.redirect(to: "/") <<< Cannot convert return expression of type 'Response' to return type 'EventLoopFuture<View>'
    }

    return try req.view().render("loginPage")
}

Это говорит мне, что, поскольку мой loginHandler должен вернуть Future<View> возвращение Response не соответствует определению метода.

Каков наилучший способ обработки этого случая?

РЕДАКТИРОВАТЬ:

Спасибо за ответ!Мой окончательный код выглядит так:

func loginHandler(_ req: Request) throws -> Future<Response> {
    if let _ = try req.authenticated(User.self) {
        return req.future().map() {
            return req.redirect(to: "/")
        }
    }
    return try req.view().render("loginPage").encode(for: req)
}

1 Ответ

0 голосов
/ 12 ноября 2018

У вас есть два варианта - вы можете либо использовать ошибку Abort.redirect(to:) и выдать ее вместо вызова перенаправления.

В противном случае вы можете изменить тип возвращаемого значения на Future<Response> и преобразовать отображаемое представление в ответ.

...