2015-10-16 146 views
0

我想知道如果流式傳輸數據並希望在流式傳輸後訪問整個數據的良好做法;在Node.JS中流式傳輸

我流是這樣的:

res._oldWrite = res.write; 
    res.write = function (chunk, encoding, cb) { 
     var decoded = chunk.toString(encoding); 
     write.write(new Buffer(decoded, encoding), encoding, cb); 
     return res._oldWrite.call(res, new Buffer(decoded, encoding), encoding, cb); 
    } 

現在,我要訪問我的數據我不喜歡的東西:

res._oldWrite = res.write; 
    var jsonData = ''; 
    res.write = function (chunk, encoding, cb) { 
     var decoded = chunk.toString(encoding); 
     jsonData += decoded; 
     write.write(new Buffer(decoded, encoding), encoding, cb); 
     return res._oldWrite.call(res, new Buffer(decoded, encoding), encoding, cb); 
    } 

    res.on('finish', function(){ 
     // Now I can have access to jsopnData but it is gross ; what is the right way? 
    }) 

但是是不是有什麼更好的辦法來做到這一點?

+0

因此,您正在將數據流式傳輸到可寫入流並希望訪問該數據?你爲什麼不在你的自定義流中流到另一個流?然後你可以添加一個列表到第二個流來獲取數據。 –

+0

對不起,我沒有明白你的意思,你可以告訴我你的解決方案在我的代碼中... –

+0

你應該**從流**中讀取,而不是攔截'.write()'調用它! – Bergi

回答

0

所以我不是100%確定我理解你的問題@Web Developer,但是因爲你問了代碼,下面是我的意思。

請注意,有可能 其他 做同樣的事情的更短的方式(但我不知道你的意思是「流式傳輸後訪問整個數據」 - 一次全部存儲在內存中)等等) :

var dataStream = require('stream').Writable(); 
//I'm assuming the "real processing" is saving to a file 
var fileStream = fs.createWriteStream('data.txt'); 
var masterStream = require('stream').Writeable(); 

masterStream._write = function (chunk, enc, next) { 

    dataStream.write(chunk); 
    fileStream.write(chunk); 
    next(); 
}; 

//if you now write to master stream, you get values in both dataStream and fileStream 
//you can now listen to dataStream and "have access to the data"