【发布时间】:2016-09-23 10:50:08
【问题描述】:
我在 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]],但我不知道如何解决这个问题。
任何帮助将不胜感激。
【问题讨论】:
-
您的
credentialsManager.checkEmailPassword方法返回什么? -
返回一个
Future[Option[Credentials]],定义为def checkEmailPassword(email: String, password: String): Future[Option[Credentials]] -
将
.map更改为.flatMap,将credentialsManager.checkEmailPassword(auth.email, auth.password).map和case (None) => Unauthorized更改为case None => Future(Unauthorized) -
太棒了!那行得通。您能否也解释一下背后的原因?我会假设它会使外部
Future[Option[Credentials]]变平,但这对内部映射/返回类型有何影响?