在Scala Play和Slick中,如何在发送响应之前获取完成请求

时间:2016-04-01 12:42:27

标签: scala playframework slick

在Scala Play和Slick中,我希望只有在数据库中创建了一条记录后才发送OK响应,到目前为止我已经得到了:

  def createItem = Action(BodyParsers.parse.json) {
    request => {
      val result = request.body.validate[Item]

      result.fold(
        invalid => {
          val problem = new Problem(BAD_REQUEST, "Invalid Item JSON", invalid.toString)
          returnProblemResult(BadRequest, problem)
        },
        item => {
          service.create(item)
          // TODO check for success before sending ok
          Ok.as(ContentTypes("DEFAULT"))
        }
      )
    }
  }

在service.create方法中:

  def create(item: Item): Future[Unit] = {
    exists(item.id).map {
      case true => 
      case _ => db.run(Item.table += cc)
    }
  }

目前,即使没有创建新项目,也会发送OK响应。如果创建了一个项目,我希望它只返回OK。如果该项目已存在,或者存在其他错误(例如数据库错误),则createItem方法应该知道发生了什么类型的问题,并返回带有错误消息的问题结果。

1 个答案:

答案 0 :(得分:0)

试试这个: -

对于服务,请将方法更改为

def create(item: Item): Future[Int] = {
     exists(item.id).map {
          case true => 0
          case _ => db.run(Item.table += cc)
      }
 }

在控制器中,执行

service.create(item).map {
     case i:Int=> Ok.as(ContentTypes("DEFAULT"))
}.recoverWith {
     // To handle the error in the processing
     case ex: Throwable => InternalServerError(ex)

}