成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

express.js框架中間件(middleware)

fuchenxuan / 2242人閱讀

摘要:框架中間件作為的老牌框架是現(xiàn)有框架中最全面的。然而在學(xué)習(xí)除了那些之外,對(duì)于框架最重要的就是中間件這個(gè)概念了。中間件功能可以執(zhí)行以下任務(wù)執(zhí)行任何代碼對(duì)請(qǐng)求和響應(yīng)對(duì)象進(jìn)行更改。結(jié)束請(qǐng)求響應(yīng)周期。調(diào)用堆棧中的下一個(gè)中間件。

express.js框架中間件(middleware)

_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)該都是可以看得懂的。

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

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

[中間件函數(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ā)了?

我是小龍,希望對(duì)大家有所幫助

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103229.html

相關(guān)文章

  • 出去就餐并且理解Express.js的基本知識(shí)

    摘要:原文譯者如果你曾經(jīng)去過一個(gè)坐下來就餐的餐廳,那么你可以了解的基礎(chǔ)知識(shí)。而且由于缺少路徑,它將在每個(gè)請(qǐng)求上運(yùn)行。這就是路由的來源。到目前為止,你已經(jīng)雇傭了一位經(jīng)理,在接受客戶請(qǐng)求之前定義了要做的事情,并且確定如何處理特定的客戶請(qǐng)求。 showImg(https://segmentfault.com/img/bVYnBo?w=4000&h=2666); 原文:Going out to e...

    xuhong 評(píng)論0 收藏0
  • expressmiddleware 設(shè)計(jì)

    摘要:入口文件在文件夾下的,其向外界暴露了一些方法。方法也是從中繼承的。入口文件很清晰,主要是完成方法的暴露以及的一些初始化操作。下一篇寫寫路由的實(shí)現(xiàn)。 還沒用express寫過server,先把部分源碼擼了一遍,各位大神求輕拍。 express入口文件在lib文件夾下的express.js,其向外界暴露了一些方法。 最主要的(express.js 第36-47行): function cr...

    zollero 評(píng)論0 收藏0
  • 解讀express 4.x源碼(1)

    摘要:在后續(xù)的總結(jié)中,我會(huì)繼續(xù)分析,并準(zhǔn)備將一些值得分析的逐一解讀,也會(huì)涉及一些。從一個(gè)官方示例開始這是官方給出的一個(gè)簡(jiǎn)單程序,運(yùn)行后訪問顯示。第一行載入了框架,我們來看源代碼中的。代碼的開始定義了一個(gè)函數(shù),函數(shù)有形參,,為回調(diào)函數(shù)。 這兩天仔細(xì)看了看express的源碼,對(duì)其的整個(gè)實(shí)現(xiàn)有了較清晰的認(rèn)識(shí),所以想總結(jié)一下寫出來,如果有什么不對(duì)的地方,望指出。 這是第一篇,首先介紹一個(gè)最簡(jiǎn)單的...

    summerpxy 評(píng)論0 收藏0
  • express.js 路由實(shí)現(xiàn)解讀

    摘要:關(guān)于的實(shí)現(xiàn)源碼解讀,版本為。主要為路由部分。返回到的遍歷是通過尾遞歸的方式實(shí)現(xiàn)的,注意到被傳入的方法中,中處理事情最后向傳入,從而是否繼續(xù)遍歷取決于的實(shí)現(xiàn)是否調(diào)用的方法。 關(guān)于express.js的實(shí)現(xiàn)源碼解讀,版本為 4.14。主要為路由部分。 一個(gè)Web框架最重要的模塊是路由功能,該模塊的目標(biāo)是:能夠根據(jù)method、path匹配需要執(zhí)行的方法,并在定義的方法中提供有關(guān)請(qǐng)求和回應(yīng)的...

    sugarmo 評(píng)論0 收藏0
  • Express源碼學(xué)習(xí)-路由篇

    摘要:框架核心特性路由定義了路由表用于執(zhí)行不同的請(qǐng)求動(dòng)作。中間件可以設(shè)置中間件來響應(yīng)請(qǐng)求。注冊(cè)一個(gè)請(qǐng)求路由結(jié)束響應(yīng)開啟監(jiān)聽端口執(zhí)行上面代碼是一種實(shí)用工具,將為您的源的任何變化并自動(dòng)重啟服務(wù)器監(jiān)控。 Express 簡(jiǎn)介 Express 是一個(gè)簡(jiǎn)潔而靈活的 node.js Web應(yīng)用框架, 提供了一系列強(qiáng)大特性幫助你創(chuàng)建各種 Web 應(yīng)用,和豐富的 HTTP 工具。使用 Express 可以快...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<