我正在尝试在提供内容之前动态连接文件。以下非常简化的代码显示了一种方法:
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.我似乎已经在某处读过这种response.write(...);
方法不像使用fs.createReadStream
方法的流数据那样有效/低开销。我似乎记得这与当客户端无法像Node发送数据一样快地接收数据时发生的事情有关。(?)我们似乎能够从文件系统对象创建可读流,但不能从内存创建。是否可以通过流媒体方法完成上面编码的操作?最初发生文件I / O,在CreateServer函数之外?
或者,另一方面,我的担忧并不那么重要,而上述方法提供的效率可能不比流媒体方法低。
感谢。
答案 0 :(得分: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()
})
答案 1 :(得分:0)
在createServer回调之前(而不是在其中)定义Streams通常不起作用,请参阅here