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