Playframework:发现类型不匹配 scala.concurrent.Future[play.api.mvc.Result] 必需:play.api.mvc.Result

Moj*_*ojo 5 scala playframework-2.5

我在 PlayFramework 的控制器中有以下代码:

  def auth = Action.async(parse.json) { request =>
    {

      val authRequest = request.body.validate[AuthRequest]
      authRequest.fold(
        errors => Future(BadRequest),
        auth => {
          credentialsManager.checkEmailPassword(auth.email, auth.password).map {

            case Some(credential: Credentials) => {

              sessionManager.createSession(credential.authAccountId).map { //Throws an error
                case Some(authResponse: AuthResponse) => Ok(Json.toJson(authResponse))
                case None => InternalServerError

              }

            }

            case (None) => Unauthorized
          }

        })
    }
  }
Run Code Online (Sandbox Code Playgroud)

我在上面带有错误注释的行收到以下错误:

Type Mismatch:
[error]  found   : scala.concurrent.Future[play.api.mvc.Result]
[error]  required: play.api.mvc.Result
[error]               sessionManager.createSession(credential.authAccountId).map {
Run Code Online (Sandbox Code Playgroud)

那里的 createSession 调用返回 aFuture[Option[Object]]但我不知道如何解决这个问题。

任何帮助将不胜感激。

cur*_*ous 6

简短回答:更改.map.flatMapin linecredentialsManager.checkEmailPassword(auth.email, auth.password).mapcase (None) => Unauthorizedtocase None => Future(Unauthorized)

解释:

credentialsManager.checkEmailPassword(auth.email, auth.password)返回 aFuture[Option[Credentials]]并且其上的映射将始终返回 aFuture并且在其内部sessionManager.createSession(credential.authAccountId)也返回 aFuture所以,最终结果是credentialsManager.checkEmailPassword(auth.email, auth.password)为了Future[Future[something]]避免这种情况,您可以改为flatten它,然后map它可以通过以下步骤完成flatmap