【问题标题】:How to recover an error from a Future in an EssentialAction如何在 EssentialAction 中从 Future 中恢复错误
【发布时间】:2015-06-03 18:51:48
【问题描述】:

this帖子的例子开始,我想知道如何处理recover

def HasToken(action: String => EssentialAction): EssentialAction = EssentialAction { requestHeader =>
  val maybeToken = requestHeader.headers.get("session")

  val futureIteratee: Future[Iteratee[Array[Byte], SimpleResult]] = maybeToken map { token =>
    //This returns a future...
    Session.find(token).map {
      case Some(session) => action(session)(requestHeader)
      case None => Done[Array[Byte], Result](Unauthorized("Invalid token"))
    }.recover {
      Done[Array[Byte], Result](Unauthorized("400 Error finding Security Token\n"))
    }
  } getOrElse {
    Future.successful(Done[Array[Byte], Result](Unauthorized("401 No Security Token\n")))
  }

  Iteratee.flatten(futureIteratee)
}

上面的代码无法编译,我总是收到以下错误消息:

[error] /home/j3d/projects/test/app/Security.scala:80: type mismatch;
[error]  found   : scala.concurrent.Future[play.api.libs.iteratee.Iteratee[_4,play.api.mvc.Result] forSome { type _4 >: _3 <: Array[Byte]; type _3 <: Array[Byte] }]
[error]  required: scala.concurrent.Future[play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]]
[error]         } recover {
[error]           ^
[error] one error found
[error] (compile:compile) Compilation failed

我错过了什么吗?

【问题讨论】:

    标签: scala playframework future iterate


    【解决方案1】:

    奇怪的是,我认为问题可能在于该函数没有推断出您需要的正确类型。这在过去发生在我身上,结果类型取决于现有的泛型类型,例如U &gt;: T.

    在尝试了你的代码 sn-p 之后,我注意到你没有为 recover 调用使用部分函数,​​并且在我修复它之后编译没有任何问题。

    Session.find(token).map {
        case Some(session) => action(session)(requestHeader)
        case None => Done[Array[Byte], Result](Unauthorized("Invalid token"))
    }.recover {
        case _ =>
            Done[Array[Byte], Result](Unauthorized("400 Error finding Security Token\n"))
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 1970-01-01
      • 2017-03-19
      • 2016-06-19
      • 2021-12-15
      • 2012-01-21
      • 1970-01-01
      • 2022-01-10
      • 2023-03-03
      相关资源
      最近更新 更多