2017-03-26 88 views
0

我正在使用Oboe.js从节点readStream解析JSON,并且我希望以内存有效的方式将其发回给客户端。是否可以将来自Oboe的nodepath事件的数据传输到Node.js HTTP响应对象,这样我就可以将分析的数据随时传送给客户端,而不是将其全部收集并一次全部发送?这是我到目前为止的代码:管道oboe.js解析json到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 }!`)); 

回答

0

为了您的具体问题,我认为这个问题已经与res.send终止响应(docs)的事实做。鉴于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,而只想发送它的features

+0

JuanCaicedo我想我的问题是真的:是否有双流接口,或者我需要使用另一个库,如highland.js?我想避免一次缓冲内存中的整个json文件。为了回答你最后的问题,我选择了功能对象而不是整个JSON作为实验目的,但没有任何具体的意图。 – foundling

0

我认为你需要的是保持发送数据而不把整个文件保存在内存中。

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