swift - 返回重定向响应而不是预期的叶 View

标签 swift routing vapor server-side-swift

我有一个路由处理程序,它为我的登录页面返回一个 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)
}

最佳答案

您有两个选择 - 您可以使用 Abort.redirect(to:)错误并抛出它而不是调用重定向。

否则,您可以将返回类型更改为 Future<Response>并将呈现的 View 转换为响应。

关于swift - 返回重定向响应而不是预期的叶 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53267125/

相关文章:

ios - 这一行代码在 Swift 2+ 中的等价物是什么

angular - 如何从 Angular ActivatedRoute 获取参数

database - symfony2 路由,来自数据库的可选前缀

php - $this->forward 丢失了用户的请求路由?

Swift Vapor - 'Cannot invoke ' add' with an argument list of type...' 在 configure.swift 中出现错误

ios - XCode6 无法创建存档?

arrays - 如何快速将通用对象保存到数组中

swift - 混淆 map 与平面 map : Cannot invoke 'flatMap' with an argument list of type '(() -> EventLoopFuture)'

swift - 如何在 Vapor 3.0 中获取客户端 IP 地址?

swift - 如何在 Swift 中检测 fn 键按下情况?