Javascript 将oboe.js解析的json传输到Node.js中的http响应对象

Javascript 将oboe.js解析的json传输到Node.js中的http响应对象,javascript,json,node.js,express,oboe.js,Javascript,Json,Node.js,Express,Oboe.js,我正在使用Oboe.js解析节点readStream中的JSON,并希望以内存高效的方式将其发送回请求它的客户端。是否可以将Oboe的节点或路径事件中的数据通过管道传输到node.js HTTP响应对象,这样我就可以将解析后的数据实时发送到客户端,而不是一次完整地收集并发送所有数据?这是我目前掌握的代码: const express = require('express'); const app = express(); const PORT = 3000; const oboe = requi

我正在使用Oboe.js解析节点readStream中的JSON,并希望以内存高效的方式将其发送回请求它的客户端。是否可以将Oboe的
节点
路径
事件中的数据通过管道传输到node.js HTTP响应对象,这样我就可以将解析后的数据实时发送到客户端,而不是一次完整地收集并发送所有数据?这是我目前掌握的代码:

const express = require('express');
const app = express();
const PORT = 3000;
const oboe = require('oboe');
const fs = require('fs');

app.get('/download', (req, res) => {

    const jsonDataStream = fs.createReadStream('./citylots.json');

    oboe(jsonDataStream)
        .node('features.*', function(feature) {
           // res.send is non-streaming. how to stream?
            res.send(feature);
        });
});

app.listen(PORT, () => console.log(`up on port ${ PORT }!`));

对于您的具体问题,我认为问题与
res.send
终止响应()有关。假设
res
是一个可写流,您可以调用
res.write
将字符串写入响应。您需要做一些额外的工作来插入逗号以及开始的
[
]

const express = require('express');
const app = express();
const PORT = 3000;
const oboe = require('oboe');
const fs = require('fs');

app.get('/download', (req, res) => {

    const jsonDataStream = fs.createReadStream('./citylots.json');

    oboe(jsonDataStream)
        .node('features.*', function(feature) {
          res.write(JSON.stringify(feature));
        });
});

app.listen(PORT, () => console.log(`up on port ${ PORT }!`));

不过,为了避免这种情况,我想确定双簧管是否适合您的用例。这可能会使您的实现复杂化,而没有多少好处。您的目标是通过向客户端发送更少的数据来减少内存吗?换句话说,您是否试图避免发送所有
citylots.json
,而只发送其
功能?

我认为您需要的是保持发送数据,而不将整个文件保存在内存中


因此,您需要使用管道。管道将允许您使用块发送数据

JuanCaice我想我的问题是:双簧管是否有流接口,或者我是否需要使用另一个库,如highland.js?我希望避免一次在内存中缓冲整个json文件。为了回答你的最后一个问题,我刚刚选择了features对象而不是整个json,这是出于实验目的,它背后没有任何具体的意图。