Scala Slick 3 Future class 回调模式匹配
Scala Slick 3 Future class callback pattern matching
我有一个 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
}
})
)
所以,成功 class 就是问题所在,正如它所说 Pattern type is incompatible with expected type, found: Option.type, required Option[User]
。
现在,如何解决此错误以及如何通过 slick 从 select 查询中获取结果?
该模型很简单,以电子邮件和密码作为值。
感谢帮助
将该行更改为
case Success(Some(user)) => println("Success")
case Success(None) => println("User not found")
但是请注意,onComplete 很像注册回调。您可能想要做的是映射查询结果并将其转换为指示登录成功或登录失败的布尔值。第三种情况是服务异常(例如,数据库不可用)。
最简单的方法是映射 Future[Option[User]]
(在您的情况下是查询)并检查是否在数据库中找到了该用户。这将导致 Future[Boolean]
:
query.map(_.isDefined)
我有一个 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
}
})
)
所以,成功 class 就是问题所在,正如它所说 Pattern type is incompatible with expected type, found: Option.type, required Option[User]
。
现在,如何解决此错误以及如何通过 slick 从 select 查询中获取结果?
该模型很简单,以电子邮件和密码作为值。
感谢帮助
将该行更改为
case Success(Some(user)) => println("Success")
case Success(None) => println("User not found")
但是请注意,onComplete 很像注册回调。您可能想要做的是映射查询结果并将其转换为指示登录成功或登录失败的布尔值。第三种情况是服务异常(例如,数据库不可用)。
最简单的方法是映射 Future[Option[User]]
(在您的情况下是查询)并检查是否在数据库中找到了该用户。这将导致 Future[Boolean]
:
query.map(_.isDefined)