【问题标题】:How do you get items out of a Future and pass those items back as Ok(Json.toJson(items))?您如何从 Future 中获取项目并将这些项目作为 Ok(Json.toJson(items)) 传回?
【发布时间】:2019-08-13 04:00:11
【问题描述】:

您好,我正在尝试从后端微服务的数据库中获取一些项目,并将这些项目传递给我的前端微服务以显示它们。我正在努力将这些项目从 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)))
  }

这会返回类型不匹配错误,因为 val 产品仍然是 Future。我如何摆脱未来,非常感谢

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    在处理期货https://www.playframework.com/documentation/2.7.x/ScalaAsync时将控制器切换到异步Action.async

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

    【讨论】:

    • 谢谢,在你的帮助下我解决了def getProducts: Action[AnyContent] = Action.async { implicit request ⇒ productDBConnector.getProducts.map { products => if (products.nonEmpty) { Ok(Json.toJson(products)) } else { Ok("There were no products in the database") } } }
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 2020-03-23
    • 2021-04-18
    • 1970-01-01
    • 2021-11-16
    • 2016-06-30
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多