2013-09-01 3 views
4

나는 play2.1을 사용 중이며 MongoDB에서 주어진 이름이 이미 사용되었는지 확인하는 유효성 검사기가 필요합니다. 내 질문은이 라이브러리에 의존하지 않지만, 나는 비동기 MongoDB 드라이버입니다 반응 mongo를 사용하고 있습니다.Play2의 비동기 입력 검사기

일반적으로 말하면, 재생 프레임 워크 및 스칼라에서 비동기 유효성 검사를 사용하는 권장 방법은 무엇입니까? 을 알고 싶습니다. [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)) 
    } 
} 

이를 읽어 사용

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

같은 패턴 : 여기

내가 생각하지 않는 내 코드는 비동기 유효성 검사를 해결 우아한 방법입니다 코드는 작동하지만 우아한/스칼라로 보입니다. 위의 경우를 해결하기위한 대안 접근법.

+0

나는 사용자의 존재감을 사로 잡을 때도 똑같은 방법을 사용합니다. http://stackoverflow.com/questions/21709112/scala-async-callback-code-rewriting – sh1ng

답변

0

Await은 요청 스레드를 차단하므로 문제가 없다고 판단되면 솔루션이 정상적으로 작동하지만 괜찮은 방법이라고 할 수 있습니다.

저는 컨트롤러 논리에 그러한 종류의 유효성 검사를 적용하고 해당 동작을 비동기로 만들고, vailidation보다 비즈니스 논리로 생각합니다. 데이터베이스와 상호 작용하기 때문입니다.

+0

위의 코드를 진정한 비동기 방식으로 다시 작성하는 방법은 알고 싶습니다. 재생 동작은 100 % 비동기이므로 비동기 유효성 검사를 수행하는 방법이 있어야합니다. –

+0

'진정한 비동기식'방법은 컨트롤러에 비동기 파트를 JSON API가 보이는 것처럼 옮기는 것입니다. – johanandren

관련 문제