2013-09-10 4 views
0

Я пытаюсь динамически конкатенатировать файлы перед обслуживанием их содержимого. Следующий очень упрощена код показывает подход:Node Streaming, Writing and Memory

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 нет операций ввода-вывода файловой системы. Кажется, я где-то читал, что этот подход response.write(...); не так эффективен/невысокий, как потоковые данные, используя подход fs.createReadStream. Кажется, я помню, что это имело какое-то отношение к тому, что происходит, когда клиент не может получать данные так быстро, как Node может отправить его. (?) Кажется, мы можем создать читаемый поток из объекта файловой системы, но не из памяти. Возможно ли сделать то, что я закодировал выше, с потоковым подходом? Первоначально с использованием ввода-вывода файлов, вне функции 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