亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

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

  • 執(zhí)行任何代碼
  • 對請求和響應對象進行更改。
  • 結(jié)束請求響應周期。
  • 調(diào)用堆棧中的下一個中間件。

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

如果我們啟動服務,訪問'/'路由,會返回"這是一個根路由",訪問router1路由就會得到這是一個"這是一個router1路由的"的信息。這看起來是一個很簡單的路由查詢,我們理一下過程,這個請求是如何訪問到這個路由的呢。

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

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

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

GET '/router7'

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

我們分析一波,這段程序是所有的請求都要執(zhí)行的,如果按照執(zhí)行順序的說法,那么這段程序是應該放到所有路由的最前面的,也就是說這段程序是所有路由要經(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)在我有一個log函數(shù),它專門用來記錄訪問日志的。如何所有的都一起執(zhí)行了,我們加一段這樣的代碼

app.use(log)

它加在所有代碼的最上面,但是不是加上就完事了,還必須在log函數(shù)里面再加一段代碼,不然當程序執(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()
}

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

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

我們整合一下代碼。并且精簡一下,也跑一遍程序

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)//任何請求都會經(jīng)過這個log中間件 

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

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


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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解nodejs模板引擎制作

    詳解nodejs模板引擎制作

    本篇文章主要介紹了nodejs模板引擎制作 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項目

    使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項目

    這篇文章主要介紹了使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項目的教程,自動化構(gòu)建工具Grunt具有編譯壓縮單元測試等功能,十分強大,需要的朋友可以參考下
    2016-02-02
  • 深入理解nodejs中Express的中間件

    深入理解nodejs中Express的中間件

    一個Express應用就是在調(diào)用各種中間件??梢娭虚g件在web應用開發(fā)中的重要性,有興趣的可以了解一下
    2017-05-05
  • npm?i報錯以及解決方案實戰(zhàn)案例

    npm?i報錯以及解決方案實戰(zhàn)案例

    npm在前端開發(fā)流程中提供了非常完善的自動化工具鏈,但是同樣由于其復雜性導致有很多奇奇怪怪的問題,下面這篇文章主要給大家介紹了關(guān)于npm?i報錯以及解決方案的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 基于node簡單實現(xiàn)RSA加解密的方法步驟

    基于node簡單實現(xiàn)RSA加解密的方法步驟

    這篇文章主要介紹了基于node簡單實現(xiàn)RSA加解密的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • node版本過高該如何將node版本降低

    node版本過高該如何將node版本降低

    我們常使用nvm來管理node.js的版本,這樣就可以根據(jù)自己的需要來回切換node.js版本,下面這篇文章主要給大家介紹了關(guān)于node版本過高該如何將node版本降低的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Express中使用Swagger的實現(xiàn)示例

    Express中使用Swagger的實現(xiàn)示例

    swagger-express是一個規(guī)范和完整的框架實現(xiàn),本文主要介紹了Express中使用Swagger的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • node.js文件的復制、創(chuàng)建文件夾等相關(guān)操作

    node.js文件的復制、創(chuàng)建文件夾等相關(guān)操作

    這篇文章主要給大家介紹了node.js文件的復制、創(chuàng)建文件夾等相關(guān)操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • nodejs發(fā)送http請求時遇到404長時間未響應的解決方法

    nodejs發(fā)送http請求時遇到404長時間未響應的解決方法

    這篇文章主要為大家詳細介紹了nodejs發(fā)送http請求時遇到404長時間未響應的解決方法
    2017-12-12
  • node連接kafka2.0實現(xiàn)方法示例

    node連接kafka2.0實現(xiàn)方法示例

    這篇文章主要介紹了node連接kafka2.0,nodejs連接kafka2.0的實現(xiàn)方法,結(jié)合實例形式分析了kafka2.0的功能、原理、以及node.js連接kafka2.0的具體實現(xiàn)技巧,需要的朋友可以參考下
    2023-05-05

最新評論