簡體   English   中英

Play框架控制器處理多種未來

[英]Play Framework Controller Handling Multiple Futures

我有一個Play控制器,它接收來自用戶界面的Model對象。 這個模型對象是我要插入數據庫的用戶。 但是在將該用戶插入表中之前,請檢查給定電子郵件地址是否存在重復的用戶。 如果是,我拒絕請求,如果不插入。 我正在使用Slick and Play框架,這是我的控制器代碼:

  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

這實際上是什么問題?

順便說一句,您不應該在這里使用flatMap而不是map嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM