2017-03-26 4 views
0

Oboe.jsを使用してNode readStreamからJSONを解析しています。これをクライアントに送信して、メモリ効率の良い方法でリクエストしています。 OboeのnodeまたはpathイベントのデータをNode.jsのHTTPレスポンスオブジェクトにパイプすることができるので、解析されたデータをフルに収集して一度に送信するのではなく、クライアントに配信できますか?私は問題はres.sendが応答(docs)を終了するという事実に関係していると思いますが、あなたの具体的な質問についてはoboe.jsを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が書き込み可能なストリームであるとすれば、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私の質問は本当にありますか:オーボエはストリームインタフェースを持っていますか、それとも高地のような別のライブラリを使う必要がありますか?私は一度にメモリ内のjsonファイル全体をバッファリングすることを避けたい。あなたの最後の質問に答えるために、私は実験目的のためにjson全体の代わりにfeaturesオブジェクトを選択したばかりでしたが、その背後に具体的な意図はありませんでした。 – foundling

0

ファイル全体をメモリに保持せずにデータを送信し続けることが必要だと思います。

したがって、パイプを使用する必要があります。パイプはあなたがチャンクを使ってデータを送ることを可能にします

関連する問題