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 应该返回 a Future<View>
,因此返回 aResponse
不符合方法的定义。
处理这种情况的最佳方法是什么?
编辑 :
感谢你的回答 !我的最终代码如下所示:
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>
并将呈现的视图转换为响应。
推荐阅读
- javascript - CamanJS 单个通道饱和度,如 Photoshop/GIMP
- zigbee - 每个 Zigbee 模块是否都支持 868MHz
- apache - 如何在apache2中允许put方法
- javascript - 如何使用 npm 编译 JavaScript 文件并在静态 HTML 网站中使用?
- css - 响应地缩放图像,同时限制宽度和高度
- spring-boot - 没有这样的方法错误 - AerospikePersistentProperty.isImmutable()
- csv - 使用 Google Script 通过 Google 表格中的 Excel 表格导入数据
- typescript - lodash groupBy 对象变量
- django - 使用 django 2.7.1 运行迁移时遇到问题
- r - 根据用户输入生成变量列表