Scala Slick 3 Сопоставление шаблонов обратного вызова будущего класса

У меня есть DAO, где я проверяю имя пользователя и хочу расширить его для проверки пароля, но для целей тестирования, поскольку я новичок в этом, я проверяю только электронную почту. Вот ДАО:

def authenticate(username: String, password: String): Future[Option[User]] = {

    db.run(Users.filter(_.email === username).result).map(_.headOption)
  }

Теперь у меня есть форма с реализованным методом проверки. Я могу сделать обратный вызов onSuccess и onFailue, но не могу сделать onComplete. В настоящее время это так:

val loginForm = Form(
    tuple(
      "username" -> nonEmptyText,
      "password" -> nonEmptyText
    ) verifying("Wrong username or password!", fields => fields match{
      case (username, password) => {
        val query = userDao.authenticate(username, password)

        query onComplete  {
          case Success(Option[User]) => println("Success")
          case Failure(_) => println("Failed ")
        }

        false
      }
    })
  )

Итак, проблема в классе Success, как говорится Pattern type is incompatible with expected type, found: Option.type, required Option[User]. Теперь, как решить эту ошибку и как я могу получить результат этого запроса на выборку через slick? Модель проста с электронной почтой и паролем в качестве значений.

Спасибо за помощь


person Maverick    schedule 08.07.2016    source источник
comment
Возможный дубликат Могу ли я сделать асинхронную форму проверка в Play Framework 2.x (Scala)?   -  person insan-e    schedule 08.07.2016


Ответы (1)


Измените эту строку на

case Success(Some(user)) => println("Success")
case Success(None) => println("User not found")

Однако обратите внимание, что onComplete очень похож на регистрацию обратного вызова. Что вы, вероятно, захотите сделать, так это отобразить результат вашего запроса и превратить его в логическое значение, указывающее на успешный или неудачный вход в систему. Третьим случаем будет исключение службы (например, база данных недоступна).

Самый простой способ сделать это — сопоставить Future[Option[User]] (запрос в вашем случае) и проверить, был ли пользователь найден в базе данных. Это приведет к Future[Boolean]:

query.map(_.isDefined)
person rethab    schedule 08.07.2016
comment
Это имеет смысл, я использовал Some, но не думал использовать второй случай, был очень близок :). Но у меня все еще есть несколько вопросов, как мне получить значения, связанные с пользователем, такие как электронная почта, идентификатор пользователя и т. д.? И если вы имеете в виду логическое значение, то должен ли я изменить тип возвращаемого значения метода DAO на Future[Boolean]? И, что касается моего последнего вопроса, я не мог понять этот query.map(_.isDefined), где его следует использовать? - person Maverick; 08.07.2016
comment
Возможно, этот вопрос может вам помочь: stackoverflow.com/questions/14913074/ - person rethab; 08.07.2016