У меня есть обработчик маршрута, который возвращает 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)
}