arrays - node.js 流数组的 json 响应

标签 arrays json node.js rest node.js-stream

我有一个 REST 方法,它应该返回一个 JSON 数组,其中包含从 mongodb(使用 mongoose)读取的某些元素。

它应该非常简单(在实际情况下 find 方法有参数,但这不是问题):

OutDataModel.find().stream({transform: JSON.stringify}).pipe(res);

这种方法的问题是我没有得到有效的 JSON,因为结果是这样的:

{"id":"1","score":11}{"id":"2","score":12}{"id":"3","score":13}

我期待的是:

[{"id":"1","score":11},{"id":"2","score":12},{"id":"3","score":13}]

我还没有找到解决方案,但我很确定会有一个简单的解决方案。

我尝试过的:

没有什么值得我骄傲的,但就是这样。

  1. 在流式传输之前将 '[' 写入响应。
  2. 我提供了另一种调用 JSON.stringify 并在末尾添加 ',' 的方法,而不是 JSON.stringify
  3. 在流的“结束”事件中,我将 ']' 写入响应。

仍然无法使用此“解决方案”,因为我在末尾有一个逗号,如下所示:

 [{"id":"1","score":11},{"id":"2","score":12},{"id":"3","score":13},]

正如我所说,我很确定应该有一个干净的解决方案,因为它应该很常见。

这个方法会有很多并发调用,所以我不想把所有的东西都读入内存,然后把所有的东西都写到响应中。每次调用都不会返回很多记录,但它们加在一起可能会很大。消费者是一个带有spring的java应用,使用jackson解析JSON。

请告诉我怎么做。

回答

我按照接受的答案中的建议创建了一个 Transform 流,让它开始工作。

我的流看起来像这样:

var arraystream = new stream.Transform({objectMode: true});
arraystream._hasWritten = false;


arraystream._transform = function (chunk, encoding, callback) {
    console.log('_transform:' + chunk);
    if (!this._hasWritten) {
        this._hasWritten = true;
        this.push('[' + JSON.stringify(chunk));

    } else {
        this.push(',' + JSON.stringify(chunk));
    }
    callback();
};

arraystream._flush = function (callback) {
    console.log('_flush:');
    this.push(']');
    callback();

};

以及使用它的代码:

OutDataModel.find().stream().pipe(arraystream).pipe(res);

谢谢。

最佳答案

通过实现您自己的逻辑,您走在了正确的轨道上。你也可以在这里使用 ArrayFormatter 做类似的事情:https://gist.github.com/aheckmann/1403797

转换函数在每个文档上单独调用——Mongoose QueryStream 为每个“数据”事件发出一个文档,但 QueryStream 不会在语义上将它们视为任何更大数组数据结构的一部分;要获得数组格式的 JSON,您确实必须自己完成(正如您所猜测的那样)。

关于arrays - node.js 流数组的 json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28770896/

相关文章:

ios - 拥有自己的服务器的AppStore应用内购买流程

C++ 数组存储错误的值

json - 在 grails 中解析 JSON 时如何获得真正的空值而不是 JSONObject.NULL 值

javascript - ajax成功未获取php记录

json - Swift JSON 解码字典失败

node.js - Node Sequelize 组

mongodb - 是否可以使用 $inc 通过 Mongoose 更新子文档?

c# - 围绕对角线镜像位矩阵的性能改进

php - 解码 CS :GO match sharing code with PHP

c# - 选择每个以大写字母开头的单词