express.static与res.sendFile

Mik*_*ika 14 javascript node.js express

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

router.use('/', express.static(path.resolve(public + '/index.html')))
Run Code Online (Sandbox Code Playgroud)

要么

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

kyr*_*isu 13

静态中间件和sendFile()大致相同 - 它们都将文件流传输到响应流.

区别在于express.static将:

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

另一方面sendFile会:

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

他们都会:

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

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


Stu*_*ley 5

如果您想提供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
Run Code Online (Sandbox Code Playgroud)

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

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

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