Scala Slick 3 Future类回调模式匹配

时间:2016-07-08 06:24:16

标签: scala playframework slick slick-3.0 playframework-2.5

我有一个DAO,我检查用户名并希望扩展它以检查密码,但为了测试目的,因为我是新手,我只检查电子邮件。这是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]所述。 现在,如何解决此错误以及如何通过光滑从该选择查询中获取结果? 该模型很简单,电子邮件和密码为值。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

将该行更改为

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

但请注意,onComplete与注册回调非常相似。您可能想要做的是映射查询结果并将其转换为布尔值,表示登录成功或登录失败。第三种情况是服务的例外(例如,数据库不可用)。

最简单的方法是映射Future[Option[User]](查询,在您的情况下)并检查是否在数据库中找到了用户。这将产生Future[Boolean]

query.map(_.isDefined)