摘要:從中間件學習搭建靜態文件服務器原文地址中有說明它只是的一個包裝查看的源碼可以發現,它做的工作是根據傳入的查找文件是否存在,如果存在就創建一個流,不存在就拋出錯誤。
從koa-static中間件學習搭建靜態文件服務器 原文地址 koa-send
Static file serving middleware
koa-static中有說明它只是koa-send的一個包裝
const send = require("koa-send"); app.use(async (ctx) => { await send(ctx, ctx.path, { root: __dirname + "/public" }); })
查看koa-send的源碼可以發現,它做的工作是根據傳入的path查找文件是否存在,如果存在就創建一個流,不存在就拋出錯誤。
send函數可以傳入第三個參數
maxage Browser cache max-age in milliseconds. (defaults to 0)
immutable Tell the browser the resource is immutable and can be cached indefinitely. (defaults to false)
hidden Allow transfer of hidden files. (defaults to false)
root Root directory to restrict file access.
index Name of the index file to serve automatically when visiting the root location. (defaults to none)
gzip Try to serve the gzipped version of a file automatically when gzip is supported by a client and if the requested file with .gz extension exists. (defaults to true).
brotli Try to serve the brotli version of a file automatically when brotli is supported by a client and if the requested file with .br extension exists. (defaults to true).
format If not false (defaults to true), format the path to serve static file servers and not require a trailing slash for directories, so that you can do both /directory and /directory/.
setHeaders Function to set custom headers on response.
extensions Try to match extensions from passed array to search for file when no extension is sufficed in URL. First found is served. (defaults to false)
可以看一下index的作用,事實上當我們在地址欄輸入
http://www.aaa.com/ 或者 http://www.aaa.com/index.html
可以發現效果是一樣的,原因就是配置了index選項,服務端首先檢查你的path是否以 "/" 結尾,假如你配置了index選項且以 "/" 結尾,那么服務端會自動將你的path和index選項拼接,如下:
const trailingSlash = path[path.length - 1] === "/" ... if (index && trailingSlash) path += index
再看一下format的作用,其實我們經常在地址欄輸入的是
http://www.aaa.com 而不是 http://www.aaa.com/
但他們的效果也是一樣的,原因就是配置了format,經過resolve之后的path返回的是一個絕對路徑,它是其中一種狀態(文件或者文件夾),如果是文件夾,且設置了format(默認為true)和index,那么就自動添加index
stats = await fs.stat(path) // Format the path to serve static file servers // and not require a trailing slash for directories, // so that you can do both `/directory` and `/directory/` if (stats.isDirectory()) { if (format && index) { path += "/" + index stats = await fs.stat(path) } else { return } }
extensions的作用好像不多見,比如你的a文件夾
| - a | - demo.txt | - demo.json | - demo.html
假如你設置了extensions(假設為["json", "txt"]),那么你在地址欄輸入
http://www.aaa.com/a/demo 事實上等同于 http://www.aaa.com/a/demo.json
服務端會首先判斷你是否設置了extensions且path不以 ".**" 結尾
if (extensions && !/..*$/.exec(path)) { const list = [].concat(extensions) for (let i = 0; i < list.length; i++) { let ext = list[i] if (typeof ext !== "string") { throw new TypeError("option extensions must be array of strings or false") } // [".js"] 或者 ["js"] 均可以 if (!/^./.exec(ext)) ext = "." + ext if (await fs.exists(path + ext)) { path = path + ext break } } }
然后按照extensions的順序依次查找拼接的path是否存在,存在即停止查找
koa-statickoa-static的只是給koa-send包了一層,koa-send的第二個參數path是ctx.path
koa-static有個defer選項
defer If true, serves after return next(), allowing any downstream middleware to respond first.
if (!opts.defer) { return async function serve (ctx, next) { let done = false if (ctx.method === "HEAD" || ctx.method === "GET") { try { // koa-send 輸入的path不存在時拋錯(404或者500) done = await send(ctx, ctx.path, opts) } catch (err) { // 如果錯誤碼是404說明請求的不是靜態文件 if (err.status !== 404) { throw err } } } // 請求不是靜態文件 繼續執行下面的邏輯 if (!done) { await next() } } } return async function serve (ctx, next) { await next() // 假如請求方法不是get 必然不是訪問靜態資源 if (ctx.method !== "HEAD" && ctx.method !== "GET") return // 說明對請求已經做了響應 if (ctx.body != null || ctx.status !== 404) return // eslint-disable-line try { await send(ctx, ctx.path, opts) } catch (err) { if (err.status !== 404) { throw err } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92091.html
摘要:吼,所以我做了,和一樣,都是對的一層封裝,只不過用編寫,對支持良好。 其實還是得按自個兒的需求來。 koa-static 有啥問題么 koa-static是一個非常輕量的koa中間件,能夠迅速的搭建起一個靜態文件服務器,通常我們把靜態文件都放進public,并且通過類似koa-static這樣的東西來將我們的public作為靜態目錄,這樣的話,我們就能直接通過根路由進行訪問了。 emm...
摘要:吼,所以我做了,和一樣,都是對的一層封裝,只不過用編寫,對支持良好。 其實還是得按自個兒的需求來。 koa-static 有啥問題么 koa-static是一個非常輕量的koa中間件,能夠迅速的搭建起一個靜態文件服務器,通常我們把靜態文件都放進public,并且通過類似koa-static這樣的東西來將我們的public作為靜態目錄,這樣的話,我們就能直接通過根路由進行訪問了。 emm...
摘要:目錄一創建項目二配置路由三靜態資源四模板引擎五結語是由原班人馬打造的超輕量服務端框架與相比,除了自由度更高,可以自行引入中間件之外,更重要的是使用了,從而避免了回調地獄不過也是因為代碼升級,所以需要以上的環境一創建項目手動創建一個項目目錄, 目錄 一、創建項目二、配置路由三、靜態資源四、模板引擎五、結語 Koa 是由 Express 原班人馬打造的超輕量服務端框架與 Express 相...
摘要:目錄一創建項目二配置路由三靜態資源四模板引擎五結語是由原班人馬打造的超輕量服務端框架與相比,除了自由度更高,可以自行引入中間件之外,更重要的是使用了,從而避免了回調地獄不過也是因為代碼升級,所以需要以上的環境一創建項目手動創建一個項目目錄, 目錄 一、創建項目二、配置路由三、靜態資源四、模板引擎五、結語 Koa 是由 Express 原班人馬打造的超輕量服務端框架與 Express 相...
閱讀 2025·2023-04-26 00:16
閱讀 3475·2021-11-15 11:38
閱讀 3168·2019-08-30 12:50
閱讀 3178·2019-08-29 13:59
閱讀 750·2019-08-29 13:54
閱讀 2496·2019-08-29 13:42
閱讀 3305·2019-08-26 11:45
閱讀 2187·2019-08-26 11:36