最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談express.js框架中間件(middleware)

 更新時(shí)間:2019年04月07日 10:44:53   作者:小龍  
這篇文章主要介紹了淺談express.js框架中間件(middleware),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

_express.js_作為_Node.js_的老牌框架,是現(xiàn)有框架中最全面的。然而在學(xué)習(xí)express除了那些api之外,對(duì)于框架最重要的就是__中間件__這個(gè)概念了。如果理解了,就可以把這個(gè)框架玩活了,項(xiàng)目開發(fā)肯定會(huì)更加順利,而且還可以開發(fā)很多額外的功能,甚至中間件擴(kuò)展開發(fā)。

但是就這么一個(gè)東西,是很多學(xué)習(xí)node.js的小萌新們就算寫出一個(gè)博客項(xiàng)目,都不知道它到底有啥作用。我當(dāng)時(shí)在理解的時(shí)候也花了不少功夫,趁著沒有啥工作,給各位學(xué)習(xí)express.js的一點(diǎn)點(diǎn)我的指導(dǎo)意見。當(dāng)然,這里面可能也有koa2和egg的忠實(shí)粉絲,但其實(shí)所有node框架貌似都有這個(gè)概念,所以我用express舉例子,希望各位將就一下哈,應(yīng)該都是可以看得懂的。

首先我先來一波官方的解釋:

好吧,被這些英語嚇到了,來一波譯文:

[中間件函數(shù)是可以訪問請(qǐng)求對(duì)象(req)、響應(yīng)對(duì)象(res)和應(yīng)用程序請(qǐng)求響應(yīng)周期中的下一個(gè)函數(shù)的函數(shù)。下一個(gè)函數(shù)是Express路由器中的一個(gè)函數(shù),當(dāng)調(diào)用該函數(shù)時(shí),它執(zhí)行當(dāng)前中間件之后的中間件。

中間件功能可以執(zhí)行以下任務(wù):

  • 執(zhí)行任何代碼
  • 對(duì)請(qǐng)求和響應(yīng)對(duì)象進(jìn)行更改。
  • 結(jié)束請(qǐng)求響應(yīng)周期。
  • 調(diào)用堆棧中的下一個(gè)中間件。

終于知道當(dāng)初的我為毛剛開始理解的時(shí)候很困難了,說實(shí)在的看得我真的有懵的。幸好,我還是從這個(gè)坑爬出來了,我來拉你們一把了。首先我們不去深究概念,直接上一個(gè)代碼塊。

如果我們啟動(dòng)服務(wù),訪問'/'路由,會(huì)返回"這是一個(gè)根路由",訪問router1路由就會(huì)得到這是一個(gè)"這是一個(gè)router1路由的"的信息。這看起來是一個(gè)很簡(jiǎn)單的路由查詢,我們理一下過程,這個(gè)請(qǐng)求是如何訪問到這個(gè)路由的呢。

一般來說,一個(gè)express框架的項(xiàng)目會(huì)寫入很多路由,但各位要注意的是,這個(gè)請(qǐng)求并不是直接定位到這個(gè)路由的,而是一個(gè)從上至下匹配的一個(gè)過程。

有點(diǎn)亂?沒關(guān)系我們看圖

我們看到這幅圖,有一個(gè)箭頭,從上到下的。什么意思呢,如果用戶發(fā)了一個(gè)這樣的請(qǐng)求

GET '/router7'

那么他會(huì)從第一個(gè)開始一個(gè)一個(gè)去匹配,知道發(fā)現(xiàn)有一個(gè)路由名和請(qǐng)求方法都一致的路由,就立馬執(zhí)行里面的代碼,并且返回一段文字"這是一個(gè)router7路由"。這都很好理解,那么現(xiàn)在我有一個(gè)需求,就是不管訪問任何一個(gè)路由,我都要知道這個(gè)訪問者的ip地址和訪問的目標(biāo)路由打印出來,生產(chǎn)訪問日志。那么怎么做了。

我們分析一波,這段程序是所有的請(qǐng)求都要執(zhí)行的,如果按照?qǐng)?zhí)行順序的說法,那么這段程序是應(yīng)該放到所有路由的最前面的,也就是說這段程序是所有路由要經(jīng)過的一段程序,也就是我們所說的中間件。好的,廢話不多說,上代碼

const fs = require('fs')
const log = (req,res) => {
  const ip = req.ip,
     route = req.route.path
  const log = `ip:${ip} path:${route}`
   fs.writeFileSync(__dirname + '/log',log)
}

比如現(xiàn)在我有一個(gè)log函數(shù),它專門用來記錄訪問日志的。如何所有的都一起執(zhí)行了,我們加一段這樣的代碼

app.use(log)

它加在所有代碼的最上面,但是不是加上就完事了,還必須在log函數(shù)里面再加一段代碼,不然當(dāng)程序執(zhí)行到里面之后就出不去了,什么代碼了。我們重寫log函數(shù)

const log = (req,res,next) => {
  const ip = req.ip,
     route = req.route.path
  const log = `ip:${ip} path:${route}`
   fs.writeFileSync(__dirname + '/log',log)
   next()
}

大家有沒有看見那個(gè)next,它有什么作用了。前面我們提到,它其實(shí)就是一個(gè)過渡者,主要的作用其實(shí)就是經(jīng)過之后,要繼續(xù)往下面執(zhí)行,還是就此終止返回結(jié)果。

說的簡(jiǎn)單一點(diǎn),就是我們一個(gè)http請(qǐng)求,到達(dá)我們的node服務(wù)器之后,要經(jīng)歷的過程,而每經(jīng)過一個(gè)程序塊,就是個(gè)中間件,每一個(gè)中間件只要有next就會(huì)傳遞到下一個(gè)中間件里面,直到服務(wù)器res響應(yīng)結(jié)果,整個(gè)路由就此結(jié)束。

我們整合一下代碼。并且精簡(jiǎn)一下,也跑一遍程序

const express = require('express')
const app = express()

const log = (req,res,next) => {
  const ip = req.ip,
     route = req.route.path
  const log = `ip:${ip} path:${route}`
   fs.writeFileSync(__dirname + '/log',log)
   next()
}

app.use(log)//任何請(qǐng)求都會(huì)經(jīng)過這個(gè)log中間件 

app.get('/', (req, res) => {
  console.log(req.route.stack)
  res.send('這是一個(gè)根路由!')
})

app.get('/router1', (req, res) => {
  res.send('這是一個(gè)router1路由!')
})
app.get('/router2', (req, res) => {
  res.send('這是一個(gè)router2路由!')
})


app.listen(3000, () => {
  console.log('app listening on port 3000!')
})
GET '/router2' //打印日志,并且返回結(jié)果

這就是一個(gè)簡(jiǎn)單的中間件解釋了。大家也可以回去看看你原來寫過的代碼,是否對(duì)之前的use這個(gè)玩意有點(diǎn)啟發(fā)了?

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 垃圾回收器的相關(guān)知識(shí)點(diǎn)總結(jié)

    垃圾回收器的相關(guān)知識(shí)點(diǎn)總結(jié)

    本文是小編在網(wǎng)絡(luò)上整理的關(guān)于垃圾回收器的相關(guān)知識(shí)點(diǎn),很多語言和程序都用的到,有興趣的可以學(xué)習(xí)下。
    2018-05-05
  • Nodejs實(shí)現(xiàn)爬蟲抓取數(shù)據(jù)實(shí)例解析

    Nodejs實(shí)現(xiàn)爬蟲抓取數(shù)據(jù)實(shí)例解析

    這篇文章主要介紹了Nodejs實(shí)現(xiàn)爬蟲抓取數(shù)據(jù)實(shí)例解析,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • node.js中的fs.chmodSync方法使用說明

    node.js中的fs.chmodSync方法使用說明

    這篇文章主要介紹了node.js中的fs.chmodSync方法使用說明,本文介紹了fs.chmodSync方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js 使用 cors 中間件解決跨域問題小結(jié)

    Node.js 使用 cors 中間件解決跨域問題小結(jié)

    cors 是 Express 的一個(gè)第三方中間件,通過安裝和配置 cors 中間件,可以很方便地解決跨域問題,本文介紹Node.js 使用 cors 中間件解決跨域問題,感興趣的朋友一起看看吧
    2024-01-01
  • 使用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法

    使用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法

    大家應(yīng)該都知道在客戶端JavaScript腳本代碼中,對(duì)二進(jìn)制數(shù)據(jù)并沒有提供一個(gè)很好的支持。然而,在處理TCP流或文件流時(shí),必須要處理二進(jìn)制數(shù)據(jù)。因此,下面通過這篇文章來一起看看利用node.js中的Buffer類處理二進(jìn)制數(shù)據(jù)的方法,有需要的朋友們可以參考借鑒。
    2016-11-11
  • KOA+egg.js集成kafka消息隊(duì)列的示例

    KOA+egg.js集成kafka消息隊(duì)列的示例

    這篇文章主要介紹了KOA+egg.js集成kafka消息隊(duì)列的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • nodejs實(shí)現(xiàn)簡(jiǎn)單的gulp打包

    nodejs實(shí)現(xiàn)簡(jiǎn)單的gulp打包

    因?yàn)橹耙恢庇腥私o我推薦gulp,說他這里好哪里好的。實(shí)際上對(duì)我來說夠用就行。grunt熟悉以后實(shí)際上他的配置也不難,說到效率的話確實(shí)是個(gè)問題,尤其項(xiàng)目大了以后,目前位置遇到的項(xiàng)目都還可以忍受。不過不管怎么說,需要親自用過gulp之后才能品評(píng)他和grunt之間的優(yōu)劣。
    2017-12-12
  • node.js中RPC(遠(yuǎn)程過程調(diào)用)的實(shí)現(xiàn)原理介紹

    node.js中RPC(遠(yuǎn)程過程調(diào)用)的實(shí)現(xiàn)原理介紹

    這篇文章主要介紹了node.js中RPC(遠(yuǎn)程過程調(diào)用)的實(shí)現(xiàn)原理介紹,本文基于一個(gè)簡(jiǎn)單的RPC庫nodejs light_rpc實(shí)現(xiàn),需要的朋友可以參考下
    2014-12-12
  • Node.js實(shí)現(xiàn)登陸注冊(cè)功能

    Node.js實(shí)現(xiàn)登陸注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了Node.js實(shí)現(xiàn)登陸注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • node.js解決獲取圖片真實(shí)文件類型的問題

    node.js解決獲取圖片真實(shí)文件類型的問題

    這篇文章主要介紹了node.js解決獲取圖片真實(shí)文件類型的問題,本文根據(jù)二進(jìn)制流及文件頭獲取文件類型mime-type,然后讀取文件二進(jìn)制的頭信息,獲取其真實(shí)的文件類型,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

瓦房店市| 屏东县| 九江县| 武夷山市| 镇雄县| 青冈县| 巴林左旗| 阿坝县| 根河市| 凤冈县| 安远县| 察隅县| 岗巴县| 保定市| 军事| 武威市| 肇庆市| 博白县| 桦甸市| 鄂托克前旗| 吉水县| 五大连池市| 呼伦贝尔市| 韶关市| 康保县| 轮台县| 嘉义县| 阳城县| 青阳县| 怀仁县| 信宜市| 广昌县| 石狮市| 马山县| 通州区| 九江县| 平舆县| 沙坪坝区| 顺平县| 花莲县| 永康市|