2017-01-26 5 views
0

私は、ユーザインタフェースから提供されるModelオブジェクトを取り込むPlayコントローラを持っています。このモデルオブジェクトは、私がデータベースに挿入しようとしているUserです。しかし、このユーザーをテーブルに挿入する前に、特定のEMailアドレスに対して既に存在する重複ユーザーが存在するかどうかを確認します。はいの場合はリクエストを拒否し、そうでない場合は挿入します。私はスリックとプレイフレームワークを使用していますし、ここに私のコントローラのコードは次のとおりです。Play Frameworkコントローラ複数の未来を処理する

def registerNewUser(user: User) = { 
    dbService.registerNewUser(User.toUserRow(user)) 
     .map(userID => Ok(Json.obj("status" -> "ok", "userId" -> userID))) 
     .recover { case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}")) } 
    } 

    def createUser() = Action.async(parse.tolerantJson) { request => 
    request.body.validate[User].fold(
     errors => Future.successful { 
     BadRequest(Json.obj("status" -> "error", "message" -> JsError.toJson(errors))) 
     }, 
     user => { 
     val userExists: Future[Boolean] = dbService.userExists(user.email) 
     userExists.map(value => { 
      if (value) UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists")) 
      else registerNewUser(user) 
     }).recover { 
      case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}")) 
     } 
     } // compilation failure on this line [[ Line X ]] 
    ) 
    } 

私は、このアプローチに何か問題が表示されていないが、私のコンパイラが幸せではありません。それは次のようにX線で苦情を申し立てます:

Expression of type Future[Object] does not confirm to the expected type _X 

ここで実際に何が問題になりますか?

答えて

1

ここで地図の代わりにflatMapを使用しないでください。

userExists.map(value => { 
      if (value) UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists")) 
      else registerNewUser(user) 
     }) 

registerNewUser戻りFuture右?

 val userExists: Future[Boolean] = dbService.userExists(user.email) 
     userExists.flatMap(value => { 
      if (value) Future.successful(UnprocessableEntity(Json.obj("status" -> "error", "message" -> s"user with email ${user.email.toString} already exists"))) 
      else registerNewUser(user) 
     }).recover { 
      case ex => InternalServerError(Json.obj("error" -> s"${ex.getMessage}")) 
     } 

:たぶん、このような

+0

私はバックエンドサービスを変更して、重複したユーザーと1人での挿入を確認しました。とにかく、提案のおかげで! – sparkr