Express的serve-static中間件的使用之五問


問題1:serve-static的setHeaders有什么用?

 

  1.   var express = require('express')
  2.   var serveStatic = require('serve-static')
  3.   //這個中間件也可以通過express.static來引入,第二個參數同樣表示的是和serve-static同樣的選項
  4.   var app = express()
  5.   //為一些靜態文件設置不同的過期時間,而這個設置通過一個函數也就是setHeaders來完成的
  6.   //setHeaders用於設定自定義的響應頭,函數簽名為:fn(res, path, stat)第一個參數表示response對象,第二個表示路徑,第三個表示文件的描述符
  7.  app.use(serveStatic(__dirname + '/public', {
  8.   maxAge: '1d',
  9.   setHeaders: setCustomCacheControl
  10.  }))
  11.  app.listen( 3000)
  12.   function setCustomCacheControl(res, path) {
  13.   //通過serve-static的mime對象的lookup方法查看文件的mime類型
  14.   if (serveStatic.mime.lookup(path) === 'text/html') {
  15.   // Custom Cache-Control for HTML files
  16.  res.setHeader( 'Cache-Control', 'public, max-age=0')
  17.  }
  18.  }

注意:通過setHeaders可以指定一個函數,這個函數可以對不同的文件使用不同的緩存策略,這個函數的簽名是fn(res, path, stat)。在內部可以通過serve-static的mime對象的lookup來判斷文件的mime類型,然后選擇不同的緩存策略
問題2:如果為靜態文件指定了多個目錄那么我們如何設置?

 

 

  1.   var express = require('express')
  2.   var serveStatic = require('serve-static')
  3.   var app = express()
  4.   //如果為靜態文件指定了多個目錄那么我們如何設置
  5.  app.use(serveStatic(__dirname + '/public-optimized'))
  6.  app.use(serveStatic(__dirname + '/public'))
  7.  app.listen( 3000)

注意:這時候我們就會首先查找public-optimized目錄,然后查找public目錄
問題3:默認情況下訪問會發送index.html,那么如何取消這種默認行為?

 

 

  1.   var express = require('express')
  2.   var serveStatic = require('serve-static')
  3.   var app = express()
  4.   //其中對於index參數來說:如果訪問一個目錄那么默認會發送index.html,但是我們可以把index設置為false或者我們給這個參數發送一個
  5.   //數組(或者string),那么就會按照數組指定的順序進行遍歷,前面的優先級高於后者!
  6.  app.use(serveStatic( 'public/ftp', {'index': ['default.html', 'default.htm']}))
  7.  app.listen( 3000)

注意:通過制定index參數就可以取消這種默認行為
問題4:如果指定靜態文件沒有找到,是否可以繼續查找其他后綴的文件作為備用文件?

 

 

  1.   var express = require('express')
  2.   var serveStatic = require('serve-static')
  3.   var app = express()
  4.   //其中對於index參數來說:如果訪問一個目錄那么默認會發送index.html,但是我們可以把index設置為false或者我們給這個參數發送一個
  5.   //數組(或者string),那么就會按照數組指定的順序進行遍歷,前面的優先級高於后者!
  6.  app.use(serveStatic( 'public/ftp', {'extensions': ['html', 'htm']}))
  7.  app.listen( 3000)

 

Extensions如果指定了true,那么指定的文件如果沒有被找到,那么就會把指定的數組中的后綴添加進去繼續查找,然后返回。如:['html', 'htm'],默認是false。如果我如下指定了靜態文件的目錄:

 

app.use(express.static(path.join(__dirname, 'public')));

那么如果在靜態文件中有這樣的引用:

 

 

<link rel="stylesheet" href="/stylesheets/style.css">

那么就會查找public/stylesheets/style.css來獲取文件。extensions我覺得可以用於如果沒有找到jpg圖片繼續查找png圖片的情況下,如['jpg','png']
問題5:fallthrough參數有什么用?
  讓有客戶端錯誤的請求通過就像沒有這個請求一樣,或者也可以產生一個客戶端的錯誤。如果把這個參數設置為true那么那些無效的客戶端請求或者404請求就會簡單的調用next()來觸發下一個中間件,如果設置為false那么就會觸發next(err)把錯誤消息傳遞給下一個中間件。一般情況下都是true,這時候我們可以把多個物理路徑映射到相同的URL,當前面一個路徑查詢不到資源繼續轉換到下一個物理路徑查找(這里是靜態資源的查找)。如果你確定你只有一個路徑來存放物理資源那么設置為false。這個中間件會處理所有的GET/POST/DELETE等請求,默認情況下為true!

 

文章出處:https://blog.csdn.net/liangklfang/article/details/51049031

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM