2013-09-01 105 views
4

我正在使用play2.1,我需要一個驗證器來檢查給定的名稱是否已在MongoDB中執行。我使用的反應式MongoDB是一個異步的MongoDB驅動程序,雖然我的問題不依賴於這個庫。Play2中的異步輸入驗證器

一般來說,我想知道 在play framework和scala中使用異步驗證的推薦方法是什麼?

這裏是我的代碼,我不認爲是解決異步驗證的一種優雅的方式:

Reads.verifying[String]{name=> 
Await.result(coll.find(Json.obj("name"->name)).one[JsObject].map(_.isEmpty),Duration(1, SECONDS)) 
} 

使用時讀取相同的模式[T]來驗證JsValue

notTaken=new Reads[JsValue]{ 
def reads(js:JsValue):JsResult[JsValue]={ 
    val oid = js \ "_id" 
    Await.result(coll.find(Json.obj("_id"->oid)).one[JsObject].map(_.isEmpty),Duration(1, SECONDS)) match { 
    case true => JsSuccess(js) 
    case false => JsError("Object Id doesn't exist:"+Json.stringify(oid)) 
    } 
} 

這代碼的作品,但它看起來不優雅/ scalaish。任何替代方法來解決上述案件。

+0

當用戶存在時,我會有同樣的問題。 http://stackoverflow.com/questions/21709112/scala-async-callback-code-rewriting – sh1ng

回答

0

等待阻止請求線程,如果你確定(並相應地配置播放),那麼你的解決方案是好的,但它可能不會被認爲是最佳實踐。

我會將這種驗證移動到您的控制器邏輯中,並使該操作異步,因爲它與數據庫進行交互,因此將其視爲業務邏輯而不是vailidation。

+0

我想知道,有沒有辦法以真正的異步方式重寫上述代碼。播放操作是100%異步的,所以應該有一種方法來進行異步驗證。 –

+0

以'真正的異步方式'來實現它的方法是將異步部分以JSON API看起來的方式移動到控制器。 – johanandren