Возврат ответа о перенаправлении вместо ожидаемого представления листа
У меня есть обработчик маршрута, который возвращает 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 ответ
У вас есть два варианта - вы можете использовать Abort.redirect(to:)
ошибка и бросить это вместо вызова перенаправления.
В противном случае вы можете изменить тип возвращаемого значения на Future<Response>
и преобразовать представленный вид в ответ.