成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從koa-static中間件學(xué)習(xí)搭建靜態(tài)文件服務(wù)器

Olivia / 873人閱讀

摘要:從中間件學(xué)習(xí)搭建靜態(tài)文件服務(wù)器原文地址中有說明它只是的一個(gè)包裝查看的源碼可以發(fā)現(xiàn),它做的工作是根據(jù)傳入的查找文件是否存在,如果存在就創(chuàng)建一個(gè)流,不存在就拋出錯(cuò)誤。

從koa-static中間件學(xué)習(xí)搭建靜態(tài)文件服務(wù)器 原文地址 koa-send
Static file serving middleware

koa-static中有說明它只是koa-send的一個(gè)包裝

const send = require("koa-send");

app.use(async (ctx) => {
  await send(ctx, ctx.path, { root: __dirname + "/public" });
})

查看koa-send的源碼可以發(fā)現(xiàn),它做的工作是根據(jù)傳入的path查找文件是否存在,如果存在就創(chuàng)建一個(gè)流,不存在就拋出錯(cuò)誤。

send函數(shù)可以傳入第三個(gè)參數(shù)

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的作用,事實(shí)上當(dāng)我們?cè)诘刂窓谳斎?/p>

http://www.aaa.com/
或者
http://www.aaa.com/index.html

可以發(fā)現(xiàn)效果是一樣的,原因就是配置了index選項(xiàng),服務(wù)端首先檢查你的path是否以 "/" 結(jié)尾,假如你配置了index選項(xiàng)且以 "/" 結(jié)尾,那么服務(wù)端會(huì)自動(dòng)將你的path和index選項(xiàng)拼接,如下:

const trailingSlash = path[path.length - 1] === "/"

...

if (index && trailingSlash) path += index

再看一下format的作用,其實(shí)我們經(jīng)常在地址欄輸入的是

http://www.aaa.com
而不是
http://www.aaa.com/

但他們的效果也是一樣的,原因就是配置了format,經(jīng)過resolve之后的path返回的是一個(gè)絕對(duì)路徑,它是其中一種狀態(tài)(文件或者文件夾),如果是文件夾,且設(shè)置了format(默認(rèn)為true)和index,那么就自動(dòng)添加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

假如你設(shè)置了extensions(假設(shè)為["json", "txt"]),那么你在地址欄輸入

http://www.aaa.com/a/demo

事實(shí)上等同于
http://www.aaa.com/a/demo.json

服務(wù)端會(huì)首先判斷你是否設(shè)置了extensions且path不以 ".**" 結(jié)尾

  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-static

koa-static的只是給koa-send包了一層,koa-send的第二個(gè)參數(shù)path是ctx.path

koa-static有個(gè)defer選項(xiàng)

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不存在時(shí)拋錯(cuò)(404或者500)
          done = await send(ctx, ctx.path, opts)
        } catch (err) {
          // 如果錯(cuò)誤碼是404說明請(qǐng)求的不是靜態(tài)文件
          if (err.status !== 404) {
            throw err
          }
        }
      }

      //  請(qǐng)求不是靜態(tài)文件  繼續(xù)執(zhí)行下面的邏輯
      if (!done) {
        await next()
      }
    }
  }

  return async function serve (ctx, next) {
    await next()

    // 假如請(qǐng)求方法不是get  必然不是訪問靜態(tài)資源
    if (ctx.method !== "HEAD" && ctx.method !== "GET") return
    // 說明對(duì)請(qǐng)求已經(jīng)做了響應(yīng)
    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
      }
    }
  }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92091.html

相關(guān)文章

  • Koa-Static 該換換了吧 試試 Awesome-Static

    摘要:吼,所以我做了,和一樣,都是對(duì)的一層封裝,只不過用編寫,對(duì)支持良好。 其實(shí)還是得按自個(gè)兒的需求來。 koa-static 有啥問題么 koa-static是一個(gè)非常輕量的koa中間件,能夠迅速的搭建起一個(gè)靜態(tài)文件服務(wù)器,通常我們把靜態(tài)文件都放進(jìn)public,并且通過類似koa-static這樣的東西來將我們的public作為靜態(tài)目錄,這樣的話,我們就能直接通過根路由進(jìn)行訪問了。 emm...

    kevin 評(píng)論0 收藏0
  • Koa-Static 該換換了吧 試試 Awesome-Static

    摘要:吼,所以我做了,和一樣,都是對(duì)的一層封裝,只不過用編寫,對(duì)支持良好。 其實(shí)還是得按自個(gè)兒的需求來。 koa-static 有啥問題么 koa-static是一個(gè)非常輕量的koa中間件,能夠迅速的搭建起一個(gè)靜態(tài)文件服務(wù)器,通常我們把靜態(tài)文件都放進(jìn)public,并且通過類似koa-static這樣的東西來將我們的public作為靜態(tài)目錄,這樣的話,我們就能直接通過根路由進(jìn)行訪問了。 emm...

    CNZPH 評(píng)論0 收藏0
  • Node.js使用Koa搭建 基礎(chǔ)項(xiàng)目

    摘要:目錄一創(chuàng)建項(xiàng)目二配置路由三靜態(tài)資源四模板引擎五結(jié)語是由原班人馬打造的超輕量服務(wù)端框架與相比,除了自由度更高,可以自行引入中間件之外,更重要的是使用了,從而避免了回調(diào)地獄不過也是因?yàn)榇a升級(jí),所以需要以上的環(huán)境一創(chuàng)建項(xiàng)目手動(dòng)創(chuàng)建一個(gè)項(xiàng)目目錄, 目錄 一、創(chuàng)建項(xiàng)目二、配置路由三、靜態(tài)資源四、模板引擎五、結(jié)語 Koa 是由 Express 原班人馬打造的超輕量服務(wù)端框架與 Express 相...

    BingqiChen 評(píng)論0 收藏0
  • Node.js使用Koa搭建 基礎(chǔ)項(xiàng)目

    摘要:目錄一創(chuàng)建項(xiàng)目二配置路由三靜態(tài)資源四模板引擎五結(jié)語是由原班人馬打造的超輕量服務(wù)端框架與相比,除了自由度更高,可以自行引入中間件之外,更重要的是使用了,從而避免了回調(diào)地獄不過也是因?yàn)榇a升級(jí),所以需要以上的環(huán)境一創(chuàng)建項(xiàng)目手動(dòng)創(chuàng)建一個(gè)項(xiàng)目目錄, 目錄 一、創(chuàng)建項(xiàng)目二、配置路由三、靜態(tài)資源四、模板引擎五、結(jié)語 Koa 是由 Express 原班人馬打造的超輕量服務(wù)端框架與 Express 相...

    lewif 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Olivia

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<