express.static与res.sendFile

时间:2015-07-15 08:30:53

标签: javascript node.js express

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

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

$counter= 0;
  $result= $cid->query("SELECT ComName FROM catcom"); 
  echo $count=$result->num_rows;
  while ($row= $result->fetch_assoc()) {
      $field_value[] = $row;
      $counter++;
  }

2 个答案:

答案 0 :(得分:11)

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

区别在于express.static将:

  • 为您设置ETag
  • 允许您设置扩展程序回退(例如html - > htm)
另一方面,

sendFile会:

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

他们都会:

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

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

答案 1 :(得分:4)

如果要提供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'));
})