1

おおよそ次のようなログインエンドポイントがあります

get {
  (path("token") & parameters("email", "password")) { (email, password) =>
    complete {
      DBManager.getUserByEmail(email) match {
        case Some(user) =>
          // Check everything is return something
          UserWire(user)
        case None => StatusCodes.NotFound -> "User doesn't exist"
      }
    }
  }
}

DBManager.getUserByEmail戻りますOption[User]。すべてが非同期である Slick に切り替えたところ、メソッドが を返すようになりFuture[User]ました。

future が失敗した場合、希望する応答を送信するにはどうすればよいですか? 私はこれを試しました

    complete {
      DBManager.getUserByEmail(email).map(user => {
        // Check everything is return something
        UserWire(user)
      }).recoverWith { case ex => Future.successful(StatusCodes.NotFound -> "User doesn't exist") }
    }

でコンパイルに失敗します

Error:(497, 26) type mismatch;
 found   : scala.concurrent.Future[Product with Serializable]
 required: akka.http.scaladsl.marshalling.ToResponseMarshallable
          }).recoverWith { case ex => Future.successful(StatusCodes.NotFound -> "User doesn't exist") }
                         ^

どうすれば修正できますか?

4

2 に答える 2

1

初めにすること。リアクティブ アプリケーションを構築する場合は、成功した操作のみを操作することをお勧めします。将来の失敗を処理するには、成功した操作よりも多くのリソースが必要です。のリアクティブ バージョンがDBManager.getUserByEmail返されますFuture[Option[User]]

将来がある場合は、結果を Marshallable フォームまたは応答にマップするだけです。

get {
  (path("token") & parameters("email", "password")) { (email, password) =>
    complete {
      DBManager.getUserByEmail(email) map {
        case Some(user) =>
          UserWire(user)
        case None => 
          StatusCodes.NotFound -> "User doesn't exist"
      }
    }
  }
}
于 2015-12-23T21:57:01.537 に答える