如何从 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(不推荐用于生产)