Обработка ошибок как будущее [Результат] в ReactiveMon go 16,6 - PullRequest
0 голосов
/ 10 января 2020

Как вывести ошибки mongoDB в Result с ReactiveMon go (16.6)? Я провел практически весь день, просматривая образцы, но пока не смог достичь этого. В разделе об ошибках документации возвращается Future[Unit], а не Future[Result]. И каждый другой пример / пример, который я могу найти, либо устарел, либо не делает этого; example_1 , example2

Вот что я хотел бы сделать:

  def updateById(collName: String, id: BSONObjectID) = authAction.async(parse.json) { implicit request: Request[JsValue] =>

    val oWriteJso = request.body.asOpt[JsObject]
    lazy val qJso = Json.obj("_id" -> id)

    val res = oWriteJso.map(
      wJso => mongoRepo.update(collName)(qJso, wJso)().recoverWith {
        case WriteResult.Code(11000) => Future.successful(BadRequest("it went bad"))
        case _ => Future.successful(BadRequest("also bad"))
      }
    )

    res

  }

Конечно, с сигнатурой функции как recoverWith[U >: T](pf: PartialFunction[Throwable, Future[U]])(implicit executor: ExecutionContext): Future[U] this приведенный выше код вернет ошибку, так как он должен вернуть Future[WriteResult]. Но как тогда я смогу поместить любые сообщения об ошибках, коды и т. Д. c (из mongoDB) в Result?

1 Ответ

0 голосов
/ 12 января 2020

В документации указано, как восстановить Future[WriteResult]:

.recover {
  case WriteResult.Code(11000) =>
    // if the result is defined with the error code 11000 (duplicate error)
    println("Match the code 11000")

  case WriteResult.Message("Must match this exact message") =>
    println("Match the error message")

  // ...
}

Благодаря Future комбинаторам (не указывается c для ReactiveMon go), его можно использовать независимо от типа успешного значения, которое будет поднято внутри Future.

def foo[T](future: Future[WriteResult], recoveredValue: => T)(success: WriteResult => T): Future[T] = future.map(success).recover {
  case WriteResult.Code(11000) =>
    // if the result is defined with the error code 11000 (duplicate error)
    recoveredValue

  case WriteResult.Message("Must match this exact message") =>
    recoveredValue

}
...