当它应该 return 一个对象时,光滑 return 的空列表
Slick returns empty list when it should return an object
我有一个 ApiCall table。我试图确保对于每个 api 调用,都使用了适当的令牌。用简单的英语来说,我想我在这里做的是通过 apiCallId
过滤 ApiCall
,然后取 headOption
(应该只有一个 b/c api CallId 是唯一的),然后在其上进行映射。但是出于某种原因,这个函数 returns 是一个空的 List()
...
def apiCallMatchesToken(apiCallId: ApiCallId, token: String): Future[Boolean] = {
val tableQuery = ApiCalls.filter(_.apiCallId === apiCallId).result.headOption
database.tryRun(tableQuery).map({
case (a: ApiCallRow) => if (a.token == token) { true } else { false }
case _ => false
})
}
我已仔细检查 apiCallId
是否存在于我的数据库中。有什么问题?
最可能的答案是您的 Option[ApiCallRow] 被包装到由 tryRun 函数添加的东西中 - 它可能是 Try[Option[ApiCallRow]]
或 Future[Option[ApiCallRow]]. Try using using a
flatMap` 而不是地图或匹配 Option这里:
database.tryRun(tableQuery).flatMap({
case Some(a: ApiCallRow) => return Future.successful(a.token == token)
case _ => Future.successful(false)
})
我有一个 ApiCall table。我试图确保对于每个 api 调用,都使用了适当的令牌。用简单的英语来说,我想我在这里做的是通过 apiCallId
过滤 ApiCall
,然后取 headOption
(应该只有一个 b/c api CallId 是唯一的),然后在其上进行映射。但是出于某种原因,这个函数 returns 是一个空的 List()
...
def apiCallMatchesToken(apiCallId: ApiCallId, token: String): Future[Boolean] = {
val tableQuery = ApiCalls.filter(_.apiCallId === apiCallId).result.headOption
database.tryRun(tableQuery).map({
case (a: ApiCallRow) => if (a.token == token) { true } else { false }
case _ => false
})
}
我已仔细检查 apiCallId
是否存在于我的数据库中。有什么问题?
最可能的答案是您的 Option[ApiCallRow] 被包装到由 tryRun 函数添加的东西中 - 它可能是 Try[Option[ApiCallRow]]
或 Future[Option[ApiCallRow]]. Try using using a
flatMap` 而不是地图或匹配 Option这里:
database.tryRun(tableQuery).flatMap({
case Some(a: ApiCallRow) => return Future.successful(a.token == token)
case _ => Future.successful(false)
})