Playframework: Type mismatch found scala.concurrent.Future[p



我在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
          }
        })
    }
  }

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

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

那里的createSession调用返回了一个Future[Option[Object]]但我无法弄清楚如何解决此问题。

任何帮助将不胜感激。

简短回答:将.map更改为第 credentialsManager.checkEmailPassword(auth.email, auth.password).map.flatMap,将case (None) => Unauthorized更改为case None => Future(Unauthorized)

解释:

credentialsManager.checkEmailPassword(auth.email, auth.password)返回一个Future[Option[Credentials]],映射将始终返回一个Future,并在其中返回sessionManager.createSession(credential.authAccountId)还返回一个Future 因此,credentialsManager.checkEmailPassword(auth.email, auth.password)的最终结果Future[Future[something]]以避免这种情况,您可以flatten它,然后map它,它可以通过一个步骤完成flatmap

不确定,但这应该有效:

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).flatMap { //flatMap
        case Some(credential: Credentials) => {
          sessionManager.createSession(credential.authAccountId).map {
            case Some(authResponse: AuthResponse) => Ok(Json.toJson(authResponse))
            case None => InternalServerError
          }
        }
        case None => Future(Unauthorized) //Wrap it
      }
    })
}

}

这是对代码的简化,带有一些注释。我希望这足以抓住这个想法:

 Future(Option("validCredentials")).flatMap {
   case Some(credential) => Future("OK")
   case None => Future("Unauthorized")
 }
 //Future[Option[String]].flatMap(Option[String] => Future[String])
 //Future[A].flatMap(A => Future[B]) //where A =:= Option[String] and B =:= String
Future("

未经授权") 这是无效的,请使用 Future.success(Ok("OK"))未来成功(错误请求(未经授权))

最新更新