問題1:serve-static的setHeaders有什么用?
-
var express = require('express')
-
var serveStatic = require('serve-static')
-
//這個中間件也可以通過express.static來引入,第二個參數同樣表示的是和serve-static同樣的選項
-
var app = express()
-
//為一些靜態文件設置不同的過期時間,而這個設置通過一個函數也就是setHeaders來完成的
-
//setHeaders用於設定自定義的響應頭,函數簽名為:fn(res, path, stat)第一個參數表示response對象,第二個表示路徑,第三個表示文件的描述符
-
app.use(serveStatic(__dirname + '/public', {
-
maxAge: '1d',
-
setHeaders: setCustomCacheControl
-
}))
-
app.listen( 3000)
-
function setCustomCacheControl(res, path) {
-
//通過serve-static的mime對象的lookup方法查看文件的mime類型
-
if (serveStatic.mime.lookup(path) === 'text/html') {
-
// Custom Cache-Control for HTML files
-
res.setHeader( 'Cache-Control', 'public, max-age=0')
-
}
-
}
注意:通過setHeaders可以指定一個函數,這個函數可以對不同的文件使用不同的緩存策略,這個函數的簽名是fn(res, path, stat)。在內部可以通過serve-static的mime對象的lookup來判斷文件的mime類型,然后選擇不同的緩存策略
問題2:如果為靜態文件指定了多個目錄那么我們如何設置?
-
var express = require('express')
-
var serveStatic = require('serve-static')
-
var app = express()
-
//如果為靜態文件指定了多個目錄那么我們如何設置
-
app.use(serveStatic(__dirname + '/public-optimized'))
-
app.use(serveStatic(__dirname + '/public'))
-
app.listen( 3000)
注意:這時候我們就會首先查找public-optimized目錄,然后查找public目錄
問題3:默認情況下訪問會發送index.html,那么如何取消這種默認行為?
-
var express = require('express')
-
var serveStatic = require('serve-static')
-
var app = express()
-
//其中對於index參數來說:如果訪問一個目錄那么默認會發送index.html,但是我們可以把index設置為false或者我們給這個參數發送一個
-
//數組(或者string),那么就會按照數組指定的順序進行遍歷,前面的優先級高於后者!
-
app.use(serveStatic( 'public/ftp', {'index': ['default.html', 'default.htm']}))
-
app.listen( 3000)
注意:通過制定index參數就可以取消這種默認行為
問題4:如果指定靜態文件沒有找到,是否可以繼續查找其他后綴的文件作為備用文件?
-
var express = require('express')
-
var serveStatic = require('serve-static')
-
var app = express()
-
//其中對於index參數來說:如果訪問一個目錄那么默認會發送index.html,但是我們可以把index設置為false或者我們給這個參數發送一個
-
//數組(或者string),那么就會按照數組指定的順序進行遍歷,前面的優先級高於后者!
-
app.use(serveStatic( 'public/ftp', {'extensions': ['html', 'htm']}))
-
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