创建父实体和子实体,并在流畅的蒸汽中重定向请求



我正在尝试使用相同的请求对象创建一个实体任务和一个子项

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"的返回表达式转换为返回类型"响应"。

关于问题出在哪里的任何想法?

这段代码应该可以工作

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")
//                }
}
}
}
}

你可以学到一些东西

  1. 当您必须返回非未来结果时使用map
  2. 使用您必须返回Future<>结果flatMap
  3. 在数据库中创建对象时,请使用create而不是save
  4. 不要离开未来的电话而不像在线#7那样处理它们