如何从 Future 中获取项目并将这些项目作为 Ok(Json.toJson(items)) 传回?
How do you get items out of a Future and pass those items back as Ok(Json.toJson(items))?
你好,我正在尝试从我的后端微服务中的数据库中获取一些项目,并将它们传递到我的前端微服务以显示它们。我正在努力从 Future 中取出这些项目,然后在我的 Action 方法中执行 Ok(Json.toJson(items)) 以供前端调用。
获取数据库中的所有项目:(在我的数据库连接器中)
def getProducts(): Future[List[MusicProduct]] =
musicDB.flatMap(_.collection("products")
.find(Json.obj())
.cursor[MusicProduct]()
.collect[List](-1, Cursor.FailOnError[List[MusicProduct]]()))
前端调用的控制器动作方法:
def getProducts: Action[AnyContent] = Action { implicit request ⇒
val products: Option[List[MusicProduct]] = productDBConnector.getProducts.map {
products =>
if (products.nonEmpty) {
Some(products)
} else {
None
}
}
products.fold(InternalServerError)(prods => Ok(Json.toJson(prods)))
}
这 returns 一个类型不匹配错误,因为 val 产品仍然是 Future。我如何摆脱未来,非常感谢
在处理期货时将控制器切换为异步 Action.async
https://www.playframework.com/documentation/2.7.x/ScalaAsync
def getProducts: Action[AnyContent] = Action.async { implicit request ⇒
val products: Future[Option[List[MusicProduct]]] = productDBConnector.getProducts.map {
products =>
if (products.nonEmpty) {
Some(products)
} else {
None
}
}
products.fold(InternalServerError)(prods => Ok(Json.toJson(prods)))
}
或对未来的结果使用 await
(不推荐用于生产)
你好,我正在尝试从我的后端微服务中的数据库中获取一些项目,并将它们传递到我的前端微服务以显示它们。我正在努力从 Future 中取出这些项目,然后在我的 Action 方法中执行 Ok(Json.toJson(items)) 以供前端调用。
获取数据库中的所有项目:(在我的数据库连接器中)
def getProducts(): Future[List[MusicProduct]] =
musicDB.flatMap(_.collection("products")
.find(Json.obj())
.cursor[MusicProduct]()
.collect[List](-1, Cursor.FailOnError[List[MusicProduct]]()))
前端调用的控制器动作方法:
def getProducts: Action[AnyContent] = Action { implicit request ⇒
val products: Option[List[MusicProduct]] = productDBConnector.getProducts.map {
products =>
if (products.nonEmpty) {
Some(products)
} else {
None
}
}
products.fold(InternalServerError)(prods => Ok(Json.toJson(prods)))
}
这 returns 一个类型不匹配错误,因为 val 产品仍然是 Future。我如何摆脱未来,非常感谢
在处理期货时将控制器切换为异步 Action.async
https://www.playframework.com/documentation/2.7.x/ScalaAsync
def getProducts: Action[AnyContent] = Action.async { implicit request ⇒
val products: Future[Option[List[MusicProduct]]] = productDBConnector.getProducts.map {
products =>
if (products.nonEmpty) {
Some(products)
} else {
None
}
}
products.fold(InternalServerError)(prods => Ok(Json.toJson(prods)))
}
或对未来的结果使用 await
(不推荐用于生产)