【问题标题】:How to send multiple files with a read stream in node?如何在节点中使用读取流发送多个文件?
【发布时间】:2015-11-14 18:53:49
【问题描述】:

如果我有一个包含两个文件的目录并且我想发送两个文件。假设还有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() 以便我可以发送到单独的读取流。感谢您的帮助~

【问题讨论】:

  • 您的建议实际上是将两个文件连接在一起,这真的是您想要为客户提供的服务吗?通常,css 文件将由静态中间件单独提供。
  • 所以我的 index.html 页面在同一目录中有一个 style.css 的脚本标签。我注意到当我对'/' 进行GET 时,它会再次向'/styles.css' 进行GET。我想知道使用流服务这两个静态资产的最佳方式是什么?这更像是一个普通节点的练习,因为我觉得我已经掩盖了很多只是使用 express 很长时间。
  • @jhernandez:HTTP 不能那样工作。 HTTP1.1(当前标准)确实有一个称为流水线的功能。但它要求浏览器使用相同的套接字发出请求。如果您针对单个请求向浏览器发送多个响应,浏览器将不知道该怎么做。由于 Web 服务器上的错误实现,所有现代 Web 浏览器都禁用了流水线(您甚至无法在 Chrome 中打开它)。因此,这只会让 Firefox 用户受益,因为他们足够精通启用流水线(但不会像您这样做的方式)。
  • @jhernandez:抱歉,有一种方法可以稍微不同。这是保持活动的标题:en.wikipedia.org/wiki/HTTP_persistent_connection。但不是你这样做的方式。
  • @jhernandez:看起来节点 http.Server 已经支持keep-alive。请参阅文档:nodejs.org/api/http.html#http_event_request。它的工作方式是您根本不修改代码。因为http.Server会为每个请求(不是连接)创建一个新的reqres对象

标签: javascript node.js server


【解决方案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 文件。


这不会创建很多连接吗?

是的,也不是。

如果你的浏览器支持,节点 http.Server 支持keep-alive。这意味着如果可能,它将重新使用已打开的连接。因此,如果您担心延迟并希望实现持久连接,那么它已经为您解决了。

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

【讨论】:

    【解决方案2】:

    通常,您会通过路由处理程序提供 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');
    });
    

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 2014-12-19
      • 2017-10-16
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多