gpt4 book ai didi

scala - 如何在 Play 2 中从 ReactiveMongo 返回 JSON 的枚举器

转载 作者:行者123 更新时间:2023-12-04 21:42:55 26 4
gpt4 key购买 nike

在我们的项目中,我们使用 ReactiveMongoPlay 2.2.1 .

问题是,以 Enumerator[A] 的形式传输数据,由 ReactiveMongo 返回实际上是一个值对象的流,没有逗号分隔,也没有流的开始和结束注解,可以看成数组的开闭语句。

这给 JSON 带来了问题。消费者 JS client ,因为预期的格式是[A1,A2, ...]
所以我们跳了起来,改变了我们的Enumeratee[A]Enumerator[String] ,检查它是否是第一个元素:

    var first:Boolean = true
val aToStrs = (as.map(a => {
if(first) {
first = false;
Json.stringify(Json.toJson(a))
} else {
"," + Json.stringify(Json.toJson(a))
}
}))
Ok.chunked(
Enumerator.enumInput(Input.El("[")) andThen
aToStrs andThen
Enumerator.enumInput(Input.El("]")) andThen
Enumerator.enumInput(Input.EOF)
)

这行得通,但感觉就像在发明轮子。

对于这个常见问题,是否有更好的解决方案?

最佳答案

如果您使用 comet 或 EventSource,您将不必手工制作一种生成输出的方法,并且您实际上还可以解析客户端中项目的响应项目。使用数组响应将迫使您编写自己的解析代码或等到所有内容都到达客户端,然后才能在 JavaScript 中使用 build int JSON 解析器。

使用 EventSource 协议(protocol)进行流式传输非常容易,您应该能够执行以下操作:

implicit val cometEncoder = new Comet.CometMessage[JsValue](_.toString)
Ok.chunked(yourEnumerator &> EventSource()).as(EVENT_STREAM)

然后在客户端html中:
<script type="text/javascript">
var es = new EventSource(jsRouter.controllers.Application.streamIt().url)

es.addEventListener("message", function (event) {
var item = JSON.parse(event.data)
// ... do something with the json value ...
})
</script>

在 Play 示例项目中有一个示例,您可能还想查看 $YOUR_PLAY_DIR/samples/scala/eventsource-clock/

关于scala - 如何在 Play 2 中从 ReactiveMongo 返回 JSON 的枚举器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22036421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com