nodejs關(guān)于中間件解析
nodejs 中間件
今天我們來(lái)了解一下 nodejs 中間件,中間件可以說(shuō)是 node 中最重要也是最核心的地方。它最重要的思想便是 洋蔥模型 ,從外到內(nèi)依次執(zhí)行中間件。
說(shuō)了半天中間件到底有什么作用呢,在處理服務(wù)請(qǐng)求時(shí),我們要進(jìn)行很多細(xì)節(jié)的處理,比如解析請(qǐng)求體,報(bào)文報(bào)頭,設(shè)置 cookie 等等很多操作,如果每次訪問(wèn)路由都要編寫(xiě)這些繁瑣的代碼,將會(huì)造成代碼混亂,你可能連自己的業(yè)務(wù)邏輯代碼都找不到了。
但是有了中間件的存在,我們將那些固定功能的代碼封裝起來(lái),在每次訪問(wèn)路由后自動(dòng)去執(zhí)行我們用到的所有中間件,我們只需要把注意力放在編寫(xiě)我們的業(yè)務(wù)邏輯代碼便可。
由于大量中間件的支持,使用 node 開(kāi)發(fā)變得十分便捷,高效,比如express , egg 這些成熟的框架。
中間件的編寫(xiě)
說(shuō)了這么半天我們?nèi)绾螌?xiě)一個(gè)中間件呢,前后端交互最重要的就是兩個(gè)參數(shù) request 和 respond ,其次,每一個(gè)中間件執(zhí)行完畢應(yīng)該進(jìn)入下一個(gè)中間件,因此還需要一個(gè) next 參數(shù),用來(lái)啟動(dòng)下一個(gè)中間件。
let bodyParse = function(req, res, next){ ? ? // 中間代碼不作解釋 ? ? console.log(' 解析請(qǐng)求體'); ? ? next() }
中間件的使用
分析:我們將中間件保存在 stack 中,我們通過(guò) use 函數(shù)來(lái)注冊(cè)路由,同時(shí)為該路由注冊(cè)中間件,在 handleEvent 函數(shù)中啟動(dòng)中間件,并執(zhí)行我們的邏輯事件函數(shù)。便形成了一個(gè)簡(jiǎn)單的執(zhí)行流程,首先通過(guò)路由匹配到我們事先分配好的事件函數(shù),然后執(zhí)行其中我們注冊(cè)好的中間件,最后執(zhí)行我們的事件邏輯函數(shù),從請(qǐng)求到響應(yīng)便執(zhí)行完畢。
但是這樣有一個(gè)弊端,每一次路由都需要遍歷一次我們注冊(cè)的中間件,造成了不必要的浪費(fèi),這些相同的中間件只需要執(zhí)行一次便可。因此我們的代碼還需要改進(jìn)。
nodejs制作自定義中間件
對(duì)于Nodejs的中間件我想各位小伙伴都有所了解,下邊我就以制作一個(gè)自定義的處理表單數(shù)據(jù)的中間件為例,告訴大家如何自作一個(gè)屬于自己的自定義中間件。
1.創(chuàng)建一個(gè)util.js文件,用于封裝編寫(xiě)自定義的表單數(shù)據(jù)處理中間件
// 導(dǎo)入querystring模塊(目的是用于將下方拼接好的查詢字符串轉(zhuǎn)換成對(duì)象) const qs = require('querystring') ? //創(chuàng)建中間件處理函數(shù) function bodyParser(req, res, next) { ? let str = '' ? // 這個(gè)chunk就是每次獲取到的請(qǐng)求體的部分?jǐn)?shù)據(jù) ? req.on('data', (chunk) => { ? ? str += chunk ? }) ? ? req.on('end', () => { ? ? const body = qs.parse(str) ? ? //這里將處理好的請(qǐng)求體數(shù)據(jù)掛載到req上 ? ? // 就是為了讓后邊的路由可以通過(guò)req.body獲取到 ? ? req.body = body ? ? next() //將流轉(zhuǎn)關(guān)系傳遞給后邊的中間件或路由 ? }) } ? //導(dǎo)出中間件函數(shù) module.exports = bodyParser
2.創(chuàng)建一個(gè)app.js文件,用于創(chuàng)建服務(wù),注冊(cè)中間件
// 導(dǎo)入express模塊 const express = require('express') ? // 創(chuàng)建服務(wù)器對(duì)象 const app = express() ? // 1.導(dǎo)入自定義的中間件模塊 const bodyparser = require('./util.js') ? // 2.注冊(cè)自定義的中間件 ?將其注冊(cè)為全局可用的中間件 ? app.use(bodyparser) ? app.post('/test', (req, res) => { ? //由于全局注冊(cè)過(guò)自定義的處理請(qǐng)求體表單數(shù)據(jù)的中間件,所以這里可以直接獲取到請(qǐng)求體數(shù)據(jù) ? // 如果過(guò)沒(méi)有注冊(cè)過(guò)處理表單數(shù)據(jù)的中間件,這里req.body的返回值將會(huì)是undefined ? res.send(req.body) }) ? //啟動(dòng)服務(wù)器 app.listen(80, () => { ? console.log('express server running at http://127.0.0.1'); })
3.效果測(cè)試
在集成終端中使用運(yùn)行app.js文件,啟動(dòng)服務(wù)
打開(kāi)postman
- 1.選擇post請(qǐng)求方式,在地址欄輸入http://127.0.0.1/test。
- 2.選擇Body選項(xiàng)。
- 3.選擇x-www-form-urlendcoded
- 4.填寫(xiě)請(qǐng)求體表單數(shù)據(jù)
- 5.發(fā)送請(qǐng)求
由下圖可見(jiàn),在請(qǐng)求發(fā)送后,服務(wù)器端返回的就是請(qǐng)求體對(duì)象,說(shuō)明自定義中間件生效
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js Addons翻譯(C/C++擴(kuò)展)
這篇文章主要介紹了Node.js Addons翻譯(C/C++擴(kuò)展) 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Nodejs使用exceljs實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出
在日常開(kāi)發(fā)中,我們常需在后臺(tái)管理系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入與導(dǎo)出功能,以便與?Excel?文件進(jìn)行交互,本文將使用使用exceljs實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出功能,需要的可以參考下2024-03-03詳解基于node.js的腳手架工具開(kāi)發(fā)經(jīng)歷
這篇文章主要介紹了詳解基于node.js的腳手架工具開(kāi)發(fā)經(jīng)歷,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子)
這篇文章主要介紹了Nodejs 發(fā)送Post請(qǐng)求功能(發(fā)短信驗(yàn)證碼例子),需要的朋友可以參考下2017-02-02Nodejs+express+ejs簡(jiǎn)單使用實(shí)例代碼
本篇文章主要介紹了Nodejs+express+ejs簡(jiǎn)單使用實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09nodejs express配置自簽名https服務(wù)器的方法
這篇文章主要介紹了nodejs express配置自簽名https服務(wù)器的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05NodeJS配置CORS實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了NodeJS配置CORS實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12