2017-02-22 6 views
1

Я пытаюсь составить базовую аутентификацию с каким-либо другим действием:Асинхронный версия AuthenticatedBuilder в игре 2

def findByNameSecure(username: String) = Authenticated { _ => 
    val cursor: Cursor[JsObject] = persons. 
     find(Json.obj("userdetails.username" -> username)). 
     cursor[JsObject](ReadPreference.primary) 
    val res = cursor.collect[List]().map { persons => 
     Ok(Json.toJson(persons)) 
    } .recover { 
     case _ => BadRequest(Json.parse("{'error': 'failed to read from db'}")) 
    } 
    Await.result(res, 10.seconds) 
    } 

Маршрут:

GET  /secure/user/findbyname  controllers.UserController.findByNameSecure(username: String) 

Это работает, как ожидалось. Меня беспокоит то, что я использовал Await.result, который блокирует. Как я могу составить асинхронную версию такого типа аутентификации?

Я использую игру 2.4.

+0

Почему вы не пишете простой пример кода, который каждый может скомпилировать и, возможно, работать? Вы пробовали - 'def findByNameSecure (имя пользователя: String) = Authenticated.async {_ =>' – EnverOsmanov

+0

Извините, я не могу показать весь проект. 'Authenticated.async' работает хорошо. Благодаря! Я бы с радостью принял его, если бы вы могли написать его в качестве ответа. – qed

+0

Ваша бизнес-логика не связана с вопросом, поэтому вы можете просто удалить ее. Пример: https://scastie.scala-lang.org/3821 Как просто вы пишете как можно больше помощи. – EnverOsmanov

ответ

3

AuthendicatedBuilder является дочерью ActionBuilder. Поэтому я предположил, что его метод async должен работать.

Пример использования:

def findByNameSecure(username: String) = Authenticated.async { _ => 
Смежные вопросы