2016-08-26 81 views
2

我需要用akka-http和reactivemongo編寫簡單的web服務。斯卡拉未來與akka-http

功能來保存數據看起來像這樣

def saveRoute(route: Route):Future[WriteResult] = { 
    collection.insert(route) 
} 

調用此函數看起來像這樣

val userRoutes = { 
    logRequestResult("akka-http-microservice") { 
     path("routes") { 
     (post & entity(as[Route])) { route => 
      Database.saveRoute(route) 
     } 
     } 
    } 
    } 

我需要未做與路線插入的ID返回結果,並做到這一點代碼線程等待。 如果嘗試

Database.saveRoute(route).onComplete{ 
      case Success(r) => complete(r.toString) 
      case Failure(e) => complete(e.getMessage) 
      } 

它不能編譯,因爲它沒有返回值。 我知道如何以骯髒的方式製作,但真的想要以適當的方式製作。

在這種情況下應該做什麼?

+0

您可以使用'Promise'並將值放入'success'中。 – sebszyller

回答

3

好像我已經找到最有效的方式來做到這一點。它內置onComplete指令

(path("routes"/"add") & post & entity(as[Route])) { 
    route => 
     onComplete(routesController.addRoute(route)) { 
     case Success(result) => complete(StatusCodes.Created, "OK") 
     case Failure(ex) => complete(new ErrorResponse(StatusCodes.InternalServerError.intValue, ErrorResponse.ERROR, ex.getMessage)) 
     } 
    } 
0

這個怎麼樣,替換:

Database.saveRoute(route) 

有:

complete(Database.saveRoute(route).map(_.toString).recover(_.getMessage)) 
1

可以映射在未來,然後完成請求如下圖所示。

val future = Database.saveRoute(route) 
val response = future.map(_.getId).recover(_.getMessage) 
complete(response) 

在一個側面說明,處理異常,這是一個很好的做法,有一個的ExceptionHandler,並與您的路線包裹。您可以找到示例here

0

使用onSuccess可以在未來完成時處理有效響應,並在未來未成功時處理handleExceptions

val userRoutes = { 
    handleExceptions(mongoDbExceptionHandler) { 
     logRequestResult("akka-http-microservice") { 
     path("routes") { 
      (post & entity(as[Route])) { route => 
      onSuccess(Database.saveRoute(route)) { result => 
       complete(result) 
      } 
      } 
     } 
     } 
    } 
    } 

    // Something like this for whatever the exceptions you expect are 
    val mongoDbExceptionHandler = ExceptionHandler { 
    case ex: MongoDbReadException => complete(HttpResponse(InternalServerError, "No database"))) 
    } 

的onSuccess: http://doc.akka.io/docs/akka/2.4.9/scala/http/routing-dsl/directives/future-directives/onSuccess.html

handleExceptions: http://doc.akka.io/docs/akka/2.4.9/scala/http/routing-dsl/exception-handling.html