如何在Node中使用读取流发送多个文件?

3
如果我有一个目录,里面有两个文件,我想要发送这两个文件。假设这两个文件是index.html和style.css。
Router.get('/', function(req, res) {
  var indexStream = fs.createWriteStream('path to index')
  var cssStream = fs.createWriteStream('path to style')

  indexStream.pipe(res)
  styleStream.pipe(res)

})

我理解.pipe(res)会隐式调用res.end(),因此我可以发送到不同的读取流。谢谢任何帮助~

1
你所建议的实际上是将两个文件连接在一起,这真的是你想要提供给客户端的吗?通常情况下,CSS 文件会由静态中间件单独提供。 - mscdex
所以我在index.html页面中有一个脚本标签,用于同一目录下的styles.css。我注意到当我对'/'进行GET时,它会再次对'/styles.css'进行GET。我想知道使用流来服务这两个静态资源的最佳方法是什么?这更多是关于纯Node的练习,因为我感觉已经很长时间只是使用express了。 - jmarthernandez
@jhernandez:HTTP的工作方式并非如此。 HTTP1.1(当前标准)确实具有一项称为管线化的功能,但它要求浏览器使用同一套接字进行请求。如果您为单个请求向浏览器发送多个响应,则浏览器将不知道如何处理。所有现代网络浏览器都已禁用管线化(甚至在Chrome中也无法打开),原因是Web服务器上存在错误的实现。因此,这只会让Firefox用户受益,他们足够聪明地打开了管线化(但不是您正在做的方式)。 - slebetman
@jhernandez:抱歉,有一种稍微不同的方法可以做到这一点。那就是使用保持连接头部:https://en.wikipedia.org/wiki/HTTP_persistent_connection。但不是你现在这样做的方式。 - slebetman
@jhernandez:看起来node http.Server已经支持keep-alive。请参阅文档:https://nodejs.org/api/http.html#http_event_request。它的工作方式是您无需修改任何代码,因为http.Server将为每个请求(而不是连接)创建一个新的`req`和`res`对象。 - slebetman
2个回答

1
你不要这样做。
这不是Node.js的限制,而是你的网络浏览器的限制(或者更准确地说,是HTTP的限制)。你需要分别发送每个文件:
Router.get('/', function(req, res) {
  res.sendFile('path to index')
})
Router.get('/style.css', function(req, res) {
  res.sendFile('path to style')
})

如果您的路由器支持,您可以使用静态中间件来提供CSS文件。

这会不会创建很多连接?

是的,也不是。

如果您的浏览器支持,node http.Server支持keep-alive。这意味着它将尽可能重用已经打开的连接。因此,如果您担心延迟并希望实现持久连接,则已经为您处理好了。

如果您想要,可以通过设置server.timeout来更改keep-alive超时时间,但我认为默认值2分钟对于大多数网页来说已经足够了。


0
通常情况下,你会从路由处理程序中提供你的HTML,并且所有静态资源都会自动由express.static()中间件处理。
你还可以使用res.sendFile()来进一步简化事情。
所以你可以有类似这样的代码:
// Use whatever the correct path is that should be the root directory
// for serving your js, css, and other static assets.
app.use(express.static(path.join(__dirname, 'public')));

// ...

Router.get('/', function(req, res) {
  res.sendFile('path to index');
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接