我有一个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]
所述。
现在,如何解决此错误以及如何通过光滑从该选择查询中获取结果?
该模型很简单,电子邮件和密码为值。
感谢您的帮助
答案 0 :(得分:1)
将该行更改为
case Success(Some(user)) => println("Success")
case Success(None) => println("User not found")
但请注意,onComplete与注册回调非常相似。您可能想要做的是映射查询结果并将其转换为布尔值,表示登录成功或登录失败。第三种情况是服务的例外(例如,数据库不可用)。
最简单的方法是映射Future[Option[User]]
(查询,在您的情况下)并检查是否在数据库中找到了用户。这将产生Future[Boolean]
:
query.map(_.isDefined)