【问题标题】:express.static vs. res.sendFileexpress.static 与 res.sendFile
【发布时间】:2015-10-04 04:35:56
【问题描述】:

有什么区别,我应该使用哪个?我的目标是简单地提供静态 html 页面和文件。

router.use('/', express.static(path.resolve(public + '/index.html')))

router.get('/', function(req, res) {
  res.sendFile(path.resolve(public + '/index.html'))
})

【问题讨论】:

  • 您在问,useget 之间的区别。 router.use 服务于所有 4 个 http 动词,getpostbla bla。 router.get 仅在动词为 get 时才提供服务
  • router.get('/', express.static(path.resolve(public + '/index.html'))) 不起作用。所以 router.get...sendFile.. 是更合适的方法吗?因为它只使用 get 动词?
  • @StephenWright 这个问题专门针对sendFileexpress.static,而不是useget

标签: javascript node.js express


【解决方案1】:

如果您想提供public 目录中的任何文件,您应该使用express.static 中间件来提供整个目录,并安装到您的应用根目录。

(另外,您可能希望考虑将静态服务中间件作为项目的依赖项,如serve-static,以便它可以独立于 Express 进行更新。)

var serveStatic = require('serve-static'); // same as express.static

/* ... app initialization stuff goes here ... */

router.use(serveStatic(public)); // assuming you've defined `public` to some path above

这将通过发送文件来响应文件请求,读取 index.html 文件以响应对目录根的请求。

但是,如果您的路线中有某种复杂的逻辑(或者您可能在将来的某个时间点),那么您应该使用sendFile。例如,对于每分钟发送不同网站图标的服务器:

router.get('/favicon.ico', function(req, res) {
  return res.sendFile(path.resolve(public, '/icons/' + new Date().getMinutes() + '.ico'));
})

【讨论】:

    【解决方案2】:

    静态中间件和 sendFile() 基本相同 - 它们都将文件流通过管道传输到响应流。

    不同之处在于 express.static 会:

    • 为你设置ETag
    • 允许您设置扩展后备(例如 html -> htm)

    另一方面,sendFile 将:

    • 根据文件扩展名设置 Content-Type 响应 HTTP 标头

    他们都会:

    • 在 Cache-Control 上设置 max-age 属性
    • 设置 Last-Modified 标头
    • 允许您通过选项对象设置任何其他标题
    • 允许您忽略点文件

    使用静态中间件的主要优点是您无需为每个文件单独编写特定路由(或清理参数),只需将中间件指向正确的目录即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2014-11-08
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2016-01-16
      相关资源
      最近更新 更多