2017-02-21 5 views
0

ノンブロッキングにするエンドポイントで作業しています。このエンドポイントの目的は非常に簡単です。つまり、Mongoストアにドキュメントを書き込むことです。 Play 2.5.xアプリで公式MongoDB Scala Driverを使用しています。Scala - 先物を使用して例外が発生した場合に失敗した応答を送信する方法

MongoDBはtoFuture()メソッドを使用して先物をサポートしています。

問題は、コントローラの処理方法がタイプFuture[Result]に解決されることが予想されることです。ただし、onCompleteコールバック(または他のコールバック関数)はタイプUnitのみを返し、コンパイルエラーが発生します。これらの状況に使用されている代替パターンがありますか?私の選択肢は何ですか?

注 - 自動的に500を書き込んで投げられなかった場合、Playは例外をキャッチすることを理解します。しかし、この場合、私は手動であなたがやろうとしているに基づいて

class WriteController extends Controller { 

    def writeSingleEvent = Action.async { implicit request => 
    val mongo = mongoService.getMongoClient() // my mongoservice 
    val database_name: String = request.getQueryString("database").getOrElse("") 
    val collection_name: String = request.getQueryString("collection").getOrElse("") 

    if (database_name == "" || collection_name == "") { 
     Future(BadRequest("Must specify database and collection names")) 
    } else { 
     val database = mongo.getDatabase(database_name) 
     val collection = database.getCollection(collection_name) 

     val body = request.body.asJson.get.toString 
     val bsondocument = BsonDocument.apply(body) 
     val document = Document(bsondocument) 

     val insertFuture = collection.insertOne(document).toFuture() 
     insertFuture.onComplete { 
     case Success(_) => Future(Ok("Inserted")) 
     case Failure(_) => Future(InternalServerError) 
     } 
    } 
    } 

答えて

2

使用この代わりにonCompleteonCompleteは、副作用操作を実行するために使用されます。

insertFuture 
    .map(_ => Ok("Inserted")) 
    .recover({case _ => InternalServerError}) 
1

、あなたはおそらくtransform方法を探している、それを処理したい:

val res = insertFuture.transform(_ => Ok("Inserted"), _ => InternalServerError) 
+0

2つのエラーが発生します。 'InternalServerError'の最初の型の不一致は、型Throwableが必要です。また、全体関数は 'Unit'ではなく' FutureResult '型を返すべきです。 – satnam

関連する問題