2013-09-10 37 views
0

我正在嘗試在提供文件之前動態連接文件。以下非常簡化的代碼顯示了一種方法:節點流式傳輸,寫入和內存

var http = require('http'); 
var fs = require('fs'); 

var start = '<!doctype html><html lang="en"><head><script>'; 
var funcsA = fs.readFileSync('functionsA.js', 'utf8'); 
var funcsB = fs.readFileSync('functionsB.js', 'utf8'); 
var funcsC = fs.readFileSync('functionsC.js', 'utf8'); 
var finish = '</script></head><body>some stuff here</body></html>'; 

var output = start + funcsA + funcsB + funcsC + finish; 

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(output); 
}).listen(9000); 

實際上,我如何連接可能取決於userAgent的線索。我的標記和腳本可能是幾百千字節的組合。

我喜歡這種方法,因爲在createServer中沒有發生文件系統I/O。我似乎已經在某處讀到這種方法不像使用fs.createReadStream方法的流數據那樣有效/低開銷。我似乎記得這與當客戶端無法像Node發送數據一樣快速接收數據時會發生什麼(?)我們似乎能夠從文件系統對象創建可讀流,但不能從內存創建可讀流。是否有可能通過流式方法來完成我上面編碼的內容?隨着文件I/O最初發生,以外的CreateServer功能

另一方面,我的擔憂並不那麼重要,上述方法可能比流式方法效率低。

謝謝。

+0

是否有可能預先計算文件的這些排列它們的靜態文件存儲提前? –

+0

http://stackoverflow.com/questions/11378059/javascript-string-nodejs-stream-implementation這可能是有用的 – Idipaolo

回答

0
res.write(start) 

var A = fs.createReadStream() 
var B = fs.createReadStream() 
var C = fs.createReadStream() 

A.pipe(res, { 
    end: false 
}) 

A.on('end', function() { 
    B.pipe(res, { 
    end: false 
    }) 
}) 

B.on('end', function() { 
    C.pipe(res, { 
    end: false 
    }) 
}) 

C.on('end', function() { 
    res.write(finish) 
    res.end() 
}) 
+0

我爲你寫了一個模塊:https://github.com/jonathanong/combine-streams –

0

定義流之前(而不是內部)createServer回調通常不會工作,看到here