欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs?express實(shí)現(xiàn)中間件

 更新時(shí)間:2022年10月14日 10:42:21   作者:南方小菜  
這篇文章主要為大家介紹了nodejs?express實(shí)現(xiàn)中間件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

先看應(yīng)用

應(yīng)用規(guī)則:

  • express 中 use 的第一個(gè)參數(shù)是匹配路徑 不傳相當(dāng)于"/"
  • 中間件匹配機(jī)制是惰性匹配,即匹配路徑為/a的中間件,訪問(wèn)/aa時(shí)同樣會(huì)被執(zhí)行(這也意味著不傳匹配路徑時(shí)即所有請(qǐng)求都會(huì)應(yīng)用此中間件)
const express = require("./express");
const app = express();
// 第一個(gè)參數(shù)是匹配路徑 不傳相當(dāng)于"/"
app.use(function (req, res, next) {
  req.a = 1;
  next();
});
app.use("/", function (req, res, next) {
  req.a++;
  next();
});
app.get("/", function (req, res, next) {
  res.end(req.a + "");
});
app.use("/a", function (req, res, next) {
  req.a++;
  next();
});
app.get("/a", function (req, res, next) {
  res.end(req.a + "");
});
app.listen(3000);

實(shí)現(xiàn)思路

結(jié)合之前的路由實(shí)現(xiàn),其實(shí)中間件就是【沒(méi)有路由表】的 Layer,我們只需要

  • 訂閱監(jiān)聽(tīng)時(shí)做下對(duì)“不傳匹配路徑”等情況的處理
  • 請(qǐng)求發(fā)布時(shí)根據(jù)“是否具有路由表route屬性”進(jìn)行判斷從而對(duì)中間件區(qū)分處理

如此即可

具體實(shí)現(xiàn)

訂閱監(jiān)聽(tīng)時(shí)做下對(duì)“不傳匹配路徑”等情況的處理

定義use方法

Router.prototype.use = function (path, ...handlers) {
  if (!handlers[0]) {
    // 只傳遞了一個(gè)函數(shù)
    handlers.push(path); // app.use(function(){})  app.use()
    path = "/";
  }
  handlers.forEach((handler) => {
    let layer = new Layer(path, handler);
    layer.route = undefined; // 不寫(xiě)也是 undefined , 主要告訴你 中間件沒(méi)有 route
    this.stack.push(layer);
  });
};

請(qǐng)求發(fā)布時(shí)根據(jù)“是否具有路由表route屬性”進(jìn)行判斷從而對(duì)中間件區(qū)分處理

改寫(xiě)handle方法

Router.prototype.handle = function (req, res, done) {
  let { pathname } = url.parse(req.url);
  let method = req.method.toLowerCase();
  let idx = 0;
  const next = (err) => {
    // 中間件 和內(nèi)部的 next 方法 出錯(cuò)都會(huì)走這個(gè) next
    if (idx >= this.stack.length) return done(); // 路由處理不了 傳遞給應(yīng)用層
    let layer = this.stack[idx++];
    // 無(wú)論是路由還是中間件 前提是路徑必須匹配
    if (layer.match(pathname)) {
      // match 還沒(méi)有更改
      if (!layer.route) {
        // 沒(méi)有說(shuō)明是中間件   注意 此處就是對(duì)中間件的區(qū)分處理
        layer.handle_request(req, res, next); // 直接執(zhí)行中間件函數(shù)
      } else {
        // 路由必須匹配方法
        if (layer.route.methods[method]) {
          // 這個(gè) next 可以讓路由層掃描下一個(gè) layer
          layer.handle_request(req, res, next); // route.dispatch
        } else {
          next();
        }
      }
    } else {
      next();
    }
  };
  next(); // 請(qǐng)求來(lái)了取出第一個(gè)執(zhí)行
};

總結(jié)流程

以上就是nodejs express實(shí)現(xiàn)中間件的詳細(xì)內(nèi)容,更多關(guān)于nodejs express中間件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于node使用multer進(jìn)行文件的上傳與下載

    關(guān)于node使用multer進(jìn)行文件的上傳與下載

    這篇文章主要介紹了關(guān)于node使用multer進(jìn)行文件的上傳與下載,Multer是一個(gè)Node.js中間件,用于處理表單數(shù)據(jù)中的multipart/form-data類(lèi)型,需要的朋友可以參考下
    2023-04-04
  • 基于node的tcp客戶端和服務(wù)端的簡(jiǎn)單通信

    基于node的tcp客戶端和服務(wù)端的簡(jiǎn)單通信

    通過(guò)Nodejs,我們可以快速地搭建一個(gè)簡(jiǎn)單的Web服務(wù)器,實(shí)現(xiàn)服務(wù)端與客戶端的簡(jiǎn)單通信,本文主要介紹了基于node的tcp客戶端和服務(wù)端的簡(jiǎn)單通信,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解Node 定時(shí)器

    詳解Node 定時(shí)器

    這篇文章主要介紹了Node 定時(shí)器的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • node.js中實(shí)現(xiàn)kindEditor圖片上傳功能的方法教程

    node.js中實(shí)現(xiàn)kindEditor圖片上傳功能的方法教程

    最近在做一個(gè)類(lèi)似于論壇的系統(tǒng),帖子需要進(jìn)行圖文并茂的顯示,所以用到了富文本編輯器:kindeditor,下面這篇文章主要給大家介紹了在node.js中實(shí)現(xiàn)kindEditor圖片上傳功能的方法教程,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04
  • electron demo項(xiàng)目npm install安裝失敗的解決方法

    electron demo項(xiàng)目npm install安裝失敗的解決方法

    下面小編就為大家分享一篇electron demo項(xiàng)目npm install安裝失敗的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)

    深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)

    這篇文章主要介紹了深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Node.js中的npm單獨(dú)與批量升級(jí)依賴(lài)包的方式超詳細(xì)講解

    Node.js中的npm單獨(dú)與批量升級(jí)依賴(lài)包的方式超詳細(xì)講解

    npm outdated僅檢查所有已安裝包的依賴(lài)關(guān)系,并將當(dāng)前版本遠(yuǎn)程倉(cāng)庫(kù)中的最新版本進(jìn)行對(duì)比,不會(huì)升級(jí),這篇文章主要介紹了Node.js中的npm單獨(dú)與批量升級(jí)依賴(lài)包的方式超詳細(xì)講解,需要的朋友可以參考下
    2024-02-02
  • 充分發(fā)揮Node.js程序性能的一些方法介紹

    充分發(fā)揮Node.js程序性能的一些方法介紹

    這篇文章主要介紹了充分發(fā)揮Node.js程序性能的一些方法介紹,Node.js是把JavaScript用于服務(wù)器端的框架,需要的朋友可以參考下
    2015-06-06
  • package.json文件配置詳解

    package.json文件配置詳解

    這篇文章主要介紹了package.json文件配置詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-06-06
  • NodeJS學(xué)習(xí)筆記之Module的簡(jiǎn)介

    NodeJS學(xué)習(xí)筆記之Module的簡(jiǎn)介

    模塊是Node.js 應(yīng)用程序的基本組成部分,文件和模塊是一一對(duì)應(yīng)的。換言之,一個(gè) Node.js 文件就是一個(gè)模塊,這個(gè)文件可能是JavaScript 代碼、JSON 或者編譯過(guò)的C/C++ 擴(kuò)展。
    2017-03-03

最新評(píng)論