成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

express簡(jiǎn)單實(shí)現(xiàn)

Mertens / 1862人閱讀

摘要:框架實(shí)現(xiàn)將所有請(qǐng)求方式寫入對(duì)象中匹配剩余路由中間件服務(wù)循環(huán)路由,匹配到就執(zhí)行它的函數(shù)用函數(shù)匹配中間件匹配一般路由靜態(tài)資源服務(wù)中間價(jià)實(shí)現(xiàn)使用

express 框架實(shí)現(xiàn)
const http = require("http");
const url = require("url");

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

  // 將所有請(qǐng)求方式寫入app對(duì)象中
  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);
  }

  // 服務(wù)
  let server = http.createServer((req, res) => {
    let method = req.method.toLocaleLowerCase();
    let { pathname } = url.parse(req.url, true);
    pathname = decodeURI(pathname);
    // 循環(huán)路由,匹配到就執(zhí)行它的handler函數(shù)
    // 用next函數(shù)
    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;
靜態(tài)資源服務(wù)中間價(jià)實(shí)現(xiàn)
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");

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/106846.html

相關(guān)文章

  • Express + Ejs實(shí)現(xiàn)一個(gè)簡(jiǎn)單的WebServer

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

    Tonny 評(píng)論0 收藏0
  • Express 實(shí)戰(zhàn)(五):路由

    摘要:的官方描述是是一個(gè)獨(dú)立于中間件和路由的實(shí)例,你可以將看作是只能執(zhí)行執(zhí)行中間件和路由的小心應(yīng)用。最大的不同在于只能已模塊形式存在并不能獨(dú)立運(yùn)行。另外,加密的公鑰也被稱為證書??蛻舳嗽谀玫焦€證書后會(huì)向這樣的證書頒發(fā)機(jī)構(gòu)進(jìn)行驗(yàn)證。 showImg(https://segmentfault.com/img/remote/1460000010820582); 作為 Express 中的最大特點(diǎn)...

    DevWiki 評(píng)論0 收藏0
  • Express 實(shí)戰(zhàn)(一):概覽

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

    zhaochunqi 評(píng)論0 收藏0
  • Express 實(shí)戰(zhàn)(七):視圖與模板:Pug 和 EJS

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

    wmui 評(píng)論0 收藏0
  • node express mongoose簡(jiǎn)單實(shí)現(xiàn)全棧之增刪改查

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

    AndroidTraveler 評(píng)論0 收藏0
  • Express 實(shí)戰(zhàn)(四):中間件

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<