节点流,写和内存

时间:2013-09-10 23:59:22

标签: node.js

我正在尝试在提供内容之前动态连接文件。以下非常简化的代码显示了一种方法:

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函数之外

或者,另一方面,我的担忧并不那么重要,而上述方法提供的效率可能不比流媒体方法低。

感谢。

2 个答案:

答案 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