nodejs關于中間件解析
nodejs 中間件
今天我們來了解一下 nodejs 中間件,中間件可以說是 node 中最重要也是最核心的地方。它最重要的思想便是 洋蔥模型 ,從外到內(nèi)依次執(zhí)行中間件。
說了半天中間件到底有什么作用呢,在處理服務請求時,我們要進行很多細節(jié)的處理,比如解析請求體,報文報頭,設置 cookie 等等很多操作,如果每次訪問路由都要編寫這些繁瑣的代碼,將會造成代碼混亂,你可能連自己的業(yè)務邏輯代碼都找不到了。
但是有了中間件的存在,我們將那些固定功能的代碼封裝起來,在每次訪問路由后自動去執(zhí)行我們用到的所有中間件,我們只需要把注意力放在編寫我們的業(yè)務邏輯代碼便可。
由于大量中間件的支持,使用 node 開發(fā)變得十分便捷,高效,比如express , egg 這些成熟的框架。
中間件的編寫
說了這么半天我們?nèi)绾螌懸粋€中間件呢,前后端交互最重要的就是兩個參數(shù) request 和 respond ,其次,每一個中間件執(zhí)行完畢應該進入下一個中間件,因此還需要一個 next 參數(shù),用來啟動下一個中間件。
let bodyParse = function(req, res, next){
? ? // 中間代碼不作解釋
? ? console.log(' 解析請求體');
? ? next()
}中間件的使用
分析:我們將中間件保存在 stack 中,我們通過 use 函數(shù)來注冊路由,同時為該路由注冊中間件,在 handleEvent 函數(shù)中啟動中間件,并執(zhí)行我們的邏輯事件函數(shù)。便形成了一個簡單的執(zhí)行流程,首先通過路由匹配到我們事先分配好的事件函數(shù),然后執(zhí)行其中我們注冊好的中間件,最后執(zhí)行我們的事件邏輯函數(shù),從請求到響應便執(zhí)行完畢。
但是這樣有一個弊端,每一次路由都需要遍歷一次我們注冊的中間件,造成了不必要的浪費,這些相同的中間件只需要執(zhí)行一次便可。因此我們的代碼還需要改進。
nodejs制作自定義中間件
對于Nodejs的中間件我想各位小伙伴都有所了解,下邊我就以制作一個自定義的處理表單數(shù)據(jù)的中間件為例,告訴大家如何自作一個屬于自己的自定義中間件。
1.創(chuàng)建一個util.js文件,用于封裝編寫自定義的表單數(shù)據(jù)處理中間件
// 導入querystring模塊(目的是用于將下方拼接好的查詢字符串轉換成對象)
const qs = require('querystring')
?
//創(chuàng)建中間件處理函數(shù)
function bodyParser(req, res, next) {
? let str = ''
? // 這個chunk就是每次獲取到的請求體的部分數(shù)據(jù)
? req.on('data', (chunk) => {
? ? str += chunk
? })
?
? req.on('end', () => {
? ? const body = qs.parse(str)
? ? //這里將處理好的請求體數(shù)據(jù)掛載到req上
? ? // 就是為了讓后邊的路由可以通過req.body獲取到
? ? req.body = body
? ? next() //將流轉關系傳遞給后邊的中間件或路由
? })
}
?
//導出中間件函數(shù)
module.exports = bodyParser2.創(chuàng)建一個app.js文件,用于創(chuàng)建服務,注冊中間件
// 導入express模塊
const express = require('express')
?
// 創(chuàng)建服務器對象
const app = express()
?
// 1.導入自定義的中間件模塊
const bodyparser = require('./util.js')
?
// 2.注冊自定義的中間件 ?將其注冊為全局可用的中間件
?
app.use(bodyparser)
?
app.post('/test', (req, res) => {
? //由于全局注冊過自定義的處理請求體表單數(shù)據(jù)的中間件,所以這里可以直接獲取到請求體數(shù)據(jù)
? // 如果過沒有注冊過處理表單數(shù)據(jù)的中間件,這里req.body的返回值將會是undefined
? res.send(req.body)
})
?
//啟動服務器
app.listen(80, () => {
? console.log('express server running at http://127.0.0.1');
})3.效果測試
在集成終端中使用運行app.js文件,啟動服務

打開postman
- 1.選擇post請求方式,在地址欄輸入http://127.0.0.1/test。
- 2.選擇Body選項。
- 3.選擇x-www-form-urlendcoded
- 4.填寫請求體表單數(shù)據(jù)
- 5.發(fā)送請求
由下圖可見,在請求發(fā)送后,服務器端返回的就是請求體對象,說明自定義中間件生效

總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
node.js將MongoDB數(shù)據(jù)同步到MySQL的步驟
這篇文章主要給大家介紹了關于node.js將MongoDB數(shù)據(jù)同步到MySQL的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。2017-12-12
詳解node.js平臺下Express的session與cookie模塊包的配置
本篇文章主要介紹了詳解node.js平臺下Express的session與cookie模塊包的配置,具有一定的參考價值,有興趣的可以了解一下。2017-04-04
Node.js(v16.13.2版本)安裝及環(huán)境配置的圖文教程
本文主要介紹了Node.js(v16.13.2版本)安裝及環(huán)境配置的圖文教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05

