【问题标题】:Returning redirect response instead of expected leaf view返回重定向响应而不是预期的叶子视图
【发布时间】:2019-04-15 11:12:25
【问题描述】:

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

【问题讨论】:

    标签: swift routing vapor server-side-swift


    【解决方案1】:

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

    否则,您可以将返回类型更改为Future&lt;Response&gt;,并将呈现的视图转换为响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多