国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

express簡單實現

Mertens / 1805人閱讀

摘要:框架實現將所有請求方式寫入對象中匹配剩余路由中間件服務循環路由,匹配到就執行它的函數用函數匹配中間件匹配一般路由靜態資源服務中間價實現使用

express 框架實現
const http = require("http");
const url = require("url");

function createApp() {
  var app = {};
  var routes = [];

  // 將所有請求方式寫入app對象中
  http.METHODS.forEach(method => {
    method = method.toLocaleLowerCase();
    app[method] = (path, handler) => {
      let route = {
        path,
        method,
        handler
      };
      routes.push(route);
    };
  });

  // 匹配剩余路由
  app.all = (path, handler) => {
    let route = {
      method: "all",
      path,
      handler
    };
    routes.push(route);
  };

  // 中間件
  app.use = (path, handler) => {
    if(handler === undefined) {
      handler = path;
      path = "/";
    }

    let route = {
      method: "middle",
      path,
      handler,
    }

    routes.push(route);
  }

  // 服務
  let server = http.createServer((req, res) => {
    let method = req.method.toLocaleLowerCase();
    let { pathname } = url.parse(req.url, true);
    pathname = decodeURI(pathname);
    // 循環路由,匹配到就執行它的handler函數
    // 用next函數
    let i = 0;

    let next = () => {
      if(i >= routes.length) return;
      let { method: m, path: p, handler: h } = routes[i];
      i++;
      if(m === "middle") {
        // 匹配中間件
        if(p == "/" || p == pathname || pathname.startsWith(p+"/")) {
          h(req, res, next);
        } else {
          next();
        }
      } else {
        // 匹配一般路由
        if ((m == method || m == "all") && (p == pathname || p === "*")) {
          h(req, res);
        } else {
          next();
        }
      }
    }

    next();
  });

  app.listen = (...rest) => {
    server.listen(...rest);
  };

  return app;
}

module.exports = createApp;
靜態資源服務中間價實現
const path = require("path");
const fs = require("fs");
const url = require("url");

const mime = {
  css: "text/css",
  gif: "image/gif",
  html: "text/html",
  ico: "image/x-icon",
  jpeg: "image/jpeg",
  jpg: "image/jpeg",
  js: "text/javascript",
  json: "application/json",
  pdf: "application/pdf",
  png: "image/png",
  svg: "image/svg+xml",
  swf: "application/x-shockwave-flash",
  tiff: "image/tiff",
  txt: "text/plain",
  wav: "audio/x-wav",
  wma: "audio/x-ms-wma",
  wmv: "video/x-ms-wmv",
  xml: "text/xml",
  unknown: "text/plain"
};

function static(basename) {
    return (req, res, next) => {
        let { pathname } = url.parse(req.url, true);
        pathname = decodeURI(pathname);
        let p = path.resolve(path.join(basename, pathname));
        fs.stat(p, (err, stats) => {
            if(err) next();
            if(stats && stats.isFile()) {
                let ext = path.extname(p).slice(1);
                res.writeHead(200, {"content-type": `${mime[ext]};charset=utf-8`})
                let rs = fs.createReadStream(p);
                rs.pipe(res);
            } else {
                next();
            }
        })
    }
}

module.exports = static;
使用
const createApp =  require("./app/index");
const static =  require("./app/static");

let app = createApp();

app.use(static("./static"));

app.all("*", (req, res) => {
    res.end("404");
});

app.listen(8080, "127.0.0.1");

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106846.html

相關文章

  • Express + Ejs實現一個簡單的WebServer

    摘要:最近在看,讀完官方的起步教程后想著該自己折騰點東西,就先用實現一個超簡單的,主要記錄下思路。先推薦一個入門級的簡單實戰項目地址。不過鑒于初學,自身的思路肯定不會是最佳實踐,慢慢積累。 最近在看node.js,讀完官方的起步教程后想著該自己折騰點東西,就先用express + ejs實現一個超簡單的webserver,主要記錄下思路。先推薦一個nodejs入門級的簡單實戰項目地址。很適合...

    Tonny 評論0 收藏0
  • Express 實戰(五):路由

    摘要:的官方描述是是一個獨立于中間件和路由的實例,你可以將看作是只能執行執行中間件和路由的小心應用。最大的不同在于只能已模塊形式存在并不能獨立運行。另外,加密的公鑰也被稱為證書。客戶端在拿到公鑰證書后會向這樣的證書頒發機構進行驗證。 showImg(https://segmentfault.com/img/remote/1460000010820582); 作為 Express 中的最大特點...

    DevWiki 評論0 收藏0
  • Express 實戰(一):概覽

    摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風格,讓開發者從多線程中解脫了出來。其次,通過異步編程范式將其高并發的能力發揮的淋漓盡致。它也僅僅是一個處理請求并作出響應的函數,并無任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學習 Express 內容之前,我們有必要從大...

    zhaochunqi 評論0 收藏0
  • Express 實戰(七):視圖與模板:Pug 和 EJS

    摘要:而框架中最常用的兩個視圖引擎是和。實際上這些上下文對象就是會在視圖中使用到的變量。其實視圖緩存并不是緩存視圖實際上它緩存的視圖路徑。根據默認視圖引擎將缺少拓展名的視圖文件補充完整。實際上存在由不同組織維護的兩個不同版本的。 showImg(https://segmentfault.com/img/remote/1460000010821004);前面的內容大都是關于 Express 框...

    wmui 評論0 收藏0
  • node express mongoose簡單實現全棧之增刪改查

    摘要:作為一個有志向的前端,怎么能不搞搞全棧呢。。。地址歡迎大家多多交流前端技術啊,如果大家喜歡的話,請給我一個小小的哦 作為一個有志向的前端,怎么能不搞搞全(zhuang)棧(bi)呢。。。說搞咱就搞啊,后端就用node,數據庫就用mongodb,前端呢,呃,再搞個node的web框架express,思路搞定,開始搭建我們的環境,搭建之前還是先看看我們的目標和成果 項目的目標和成果 sh...

    AndroidTraveler 評論0 收藏0
  • Express 實戰(四):中間件

    摘要:調用函數執行下一個中間件函數。然后,該中間件調用函數檢查文件是否存在。為了代碼更加清晰,你也可以將代碼改寫為另外,這里在調用函數是使用的是作為輸出選項。事實上,中間件有兩種類型。 原生 Node 的單一請求處理函數,隨著功能的擴張勢必會變的越來越難以維護。而 Express 框架則可以通過中間件的方式按照模塊和功能對處理函數進行切割處理。這樣拆分后的模塊不僅邏輯清晰,更重要的是對后期維...

    mochixuan 評論0 收藏0

發表評論

0條評論

Mertens

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<