2017-02-21 40 views
0

我正在處理一個我希望成爲非阻塞的端點。此端點的目的非常簡單,即向Mongo商店寫入文檔。我在Play 2.5.x應用中使用官方MongoDB Scala Driver斯卡拉 - 如何使用期貨發送異常情況下的失敗響應

我的理解是,MongoDB支持期貨使用toFuture()方法。 Source

問題是我的控制器中的處理方法期望解析爲類型Future[Result]。但是,onComplete回調(或其他回調函數)僅返回類型Unit,導致編譯錯誤。是否有任何替代模式正在用於這些情況?我有什麼選擇?

注意 - 我知道Play會在沒有寫入並自動拋出500的情況下捕捉到異常。但在這種情況下,我想處理它手動

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

結果出現兩個錯誤。首先輸入「InternalServerError」不匹配,表示Throwable類型是必需的。此外,整體功能應該返回類型'FutureResult]'而不是'單元' – satnam