在流畅的蒸汽中创建父实体和子实体并重定向请求
Create parent entity and children and redirect request in fluent vapor
我正在尝试使用相同的请求对象创建实体任务和一个子项
func create(_ req: Request) throws -> Future<Response> {
return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
let user = try req.requireAuthenticated(User.self)
let task = Task(name: taskForm.name, userId: user.id!)
return task.save(on: req).map { t in
let interval = try Interval(taskId: t.requireID())
let t = interval.save(on: req)
return t.save(on: req).map { _ in
return req.redirect(to: "/dashboard")
}
}
}
}
我遇到的错误是:
无法将 'EventLoopFuture' 类型的 return 表达式转换为 return 类型 'Response'。
有什么问题吗?
此代码应该有效
func create(_ req: Request) throws -> Future<Response> {
return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
let user = try req.requireAuthenticated(User.self)
let task = Task(name: taskForm.name, userId: user.id!)
return task.create(on: req).flatMap { t in
let interval = try Interval(taskId: t.requireID())
return interval.create(on: req).flatMap { _ in
return t.create(on: req).transform(to: req.redirect(to: "/dashboard"))
// or your previous variant
// return t.create(on: req).map { _ in
// return req.redirect(to: "/dashboard")
// }
}
}
}
}
您可以学到一些东西
- 当你必须 return 非未来结果时使用
map
- 使用
flatMap
你必须returnFuture<>
结果
- 在 db
中创建对象时使用 create
而不是 save
- 不要像在第 7 行那样不处理以后的电话就挂断
我正在尝试使用相同的请求对象创建实体任务和一个子项
func create(_ req: Request) throws -> Future<Response> {
return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
let user = try req.requireAuthenticated(User.self)
let task = Task(name: taskForm.name, userId: user.id!)
return task.save(on: req).map { t in
let interval = try Interval(taskId: t.requireID())
let t = interval.save(on: req)
return t.save(on: req).map { _ in
return req.redirect(to: "/dashboard")
}
}
}
}
我遇到的错误是:
无法将 'EventLoopFuture' 类型的 return 表达式转换为 return 类型 'Response'。
有什么问题吗?
此代码应该有效
func create(_ req: Request) throws -> Future<Response> {
return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
let user = try req.requireAuthenticated(User.self)
let task = Task(name: taskForm.name, userId: user.id!)
return task.create(on: req).flatMap { t in
let interval = try Interval(taskId: t.requireID())
return interval.create(on: req).flatMap { _ in
return t.create(on: req).transform(to: req.redirect(to: "/dashboard"))
// or your previous variant
// return t.create(on: req).map { _ in
// return req.redirect(to: "/dashboard")
// }
}
}
}
}
您可以学到一些东西
- 当你必须 return 非未来结果时使用
map
- 使用
flatMap
你必须returnFuture<>
结果 - 在 db 中创建对象时使用
- 不要像在第 7 行那样不处理以后的电话就挂断
create
而不是 save