Play2中的异步输入验证器

时间:2013-09-01 12:14:08

标签: playframework playframework-2.0 reactivemongo

我正在使用play2.1,我需要一个验证器来检查MongoDB中是否已经使用了给定的名称。我使用的是响应式mongo,它是一个异步MongoDB驱动程序,虽然我的问题不依赖于这个库。

一般来说,我想知道  使用play框架和scala进行异步验证的推荐方法是什么?

这是我的代码,我认为这不是解决异步验证的优雅方法:

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

使用Reads [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。任何替代方法来解决上述情况。

1 个答案:

答案 0 :(得分:0)

Await阻止请求线程,如果你没关系(并相应地配置播放)那么你的解决方案没问题,但它可能不是最佳实践。

我会将这种验证转移到您的控制器逻辑中,并使该操作异步,将其视为业务逻辑,而不是将其视为与数据库交互,因为它与数据库交互。