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]]但我不知道如何解决这个问题。
任何帮助将不胜感激。
简短回答:更改.map为.flatMapin linecredentialsManager.checkEmailPassword(auth.email, auth.password).map和case (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
| 归档时间: |
|
| 查看次数: |
6594 次 |
| 最近记录: |