playframework - Play2 中的异步输入验证器

标签 playframework playframework-2.0 reactivemongo

我正在使用 play2.1,我需要一个验证器来检查给定的名称是否已在 MongoDB 中使用。我正在使用响应式(Reactive) 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。解决上述情况的任何替代方法。

最佳答案

Await 阻止请求线程,如果您对此感到满意(并相应地配置 Play ),那么您的解决方案是可以的,但它可能不会被视为最佳实践。

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

关于playframework - Play2 中的异步输入验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558341/

相关文章:

java - 为什么我的 PlayFramework 应用程序出现很长的超时?

scala - 使用 OFormat 序列化案例类时从 Play 应用程序收到警告

javascript - 在 Scala Play Framework View 中使用键检索映射值

scala - 如何在Play框架(使用Scala的2.0版)中测试期望上传文件的操作?

scala - 无法将 ReactiveMongo 添加到 Play-Framework

scala - 带有 Play Scala 的 ReactiveMongo

mongodb - Play 2.2.x,带有身份验证和请求扩展的 Action 组合

java - 玩! - 独特的模型领域

scala - 发送 FakeRequest 时如何为 akka.stream.Materializer 提供隐式值?

json - Play : How to transform JSON while writing/reading it to/from MongoDB