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。我似乎在某处读到,这种response.write(...);方法不如使用一种fs.createReadStream方法的流式数据高效/低开销。我似乎记得这与客户端无法像 Node 发送数据一样快地接收数据时发生的情况有关。(?)我们似乎能够从文件系统对象创建可读流,但不能从内存创建。是否可以使用流式处理方法完成我上面编写的代码?最初在 CreateServer 函数之外发生文件 I/O吗?

或者,另一方面,我的担忧不是那么重要吗,上面的方法提供的效率可能不低于流式方法。

谢谢。

4

2 回答 2

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()
})
于 2013-09-11T02:44:49.423 回答
0

在 createServer 回调之前(而不是在内部)定义 Streams 通常不起作用,请参见此处

于 2013-09-11T23:20:10.640 回答