關於express中介軟體的簡要解析之應用級、路由級中介軟體(一)
Express 是一個自身功能極簡,完全是由路由和中介軟體構成一個的 web 開發框架:從本質上來說,一個 Express 應用就是在呼叫各種中介軟體。中介軟體(Middleware) 是一個函式,它可以訪問請求物件(request object (req)),響應物件(response object (res)), 和 web 應用中處於請求-響應迴圈流程中的中介軟體,一般被命名為 next 的變數。
中介軟體可以分為以下五種:
- 應用級中介軟體
- 路由級中介軟體
- 錯誤處理中介軟體
- 內建中介軟體
- 第三方中介軟體
為加深理解需要做一些例項,首先要建立nodejs express 工程,在工程下隨意建立一個目錄,在該目錄下建立三個檔案 server.js、app.js和router.js。
server.js程式碼如下:
var http=require('http');
var app=require('./app');
var server=http.createServer(app);
server.listen(3000,function(){
console.log('server Listening on port 3000');
});
app.js 程式碼如下:
var express=require('express');
var app=express();
app.use(function(req,res){
console.log('firstMiddleware'
});
module.exports=app;
router.js程式碼如下:
var express=require('express');
var router=express.Router();
router.use(function(req,res,next){
console.log('firstMiddleware')
});
module.exports=router;
1、下面先對單箇中間件進行詳解:
應用級中介軟體和路由級中介軟體用法相同(執行函式都是自己編寫),應用級中介軟體使用方式為app.use([path,] function [, function...]) 和 app.METHOD([path,] function [, function...]);路由級中介軟體的使用方式為router.use([path,] function [, function...]) 和 router.METHOD([path,] function [, function...])其中,
引數說明:
path :為訪問路徑格式為 '/../..',可以省略,省略則所有請求都執行該中介軟體;
function:為執行函式,每個中介軟體的執行函式可以為單個、多個、執行函式的陣列,也可以是他們的組合,但至少得有一個執行函式;下面對他們分別介紹。
①單個執行函式:
當前的app.js檔案中的中介軟體即為典型的單個執行函式;
②多個執行函式:現把app.js檔案修改為:
var express=require('express');
var app=express();
var f1=function(req,res,next){
console.log('firstMiddleware f1')
next();
};
varf2=function(req,res,next){
console.log('firstMiddleware f2')
next();
};
var f3=function(req,res,next){
console.log('firstMiddleware f3')
};
app.use(f1,f2,f3);
module.exports=app;
執行結果為:
firstMiddleware f1
firstMiddleware f2
firstMiddleware f3
此即為典型的多個執行函式。
其中app.use(f1,f2,f3)可以修改為app.use(f1,[f2,f3])為函式與函式陣列的結合,修改為app.use([f1,f2,f3])即為函式陣列的方式;
當一箇中間件有多個執行函式時,前面的執行函式要呼叫next函式,不呼叫next函式,後面的函式將無法執行若該執行函式之前還未把res發出則會出現請求掛起,如:把f2 的 next()刪除,再執行發出請求後請求將掛起,若把f2的next()刪除後加上res.send('respose has sended!'); 則請求不再掛起但f3不會執行。由於路由中介軟體用法相同就不再詳解。
2、下面對多箇中間件之間的組合進行詳解:
當有多箇中間件時,各個中介軟體以此與請求路徑進行匹配,匹配成功則執行,不成功跳過,所有一般按匹配範圍排列中介軟體,把匹配範圍大的中介軟體放到前面(所有請求都執行的中介軟體匹配範圍最大,所有一般都放到最前面)依次排列。
現對app.js修改如下:
var express=require('express');
var app=express();
var f1=function(req,res,next){
console.log('firstMiddleware f1');
next();
};
var f2=function(req,res,next){
console.log('firstMiddleware f2');
next();
};
app.use(f1,f2);
app.use(function(req,res,next){
console.log('secondMiddleware');
res.set({
'Content-Type':'text/plain',
'Content-Length':'123',
'ETag':'12345'
})
next();
})
app.use('/hello',function(req,res,next){
console.log('hello middleware');
res.send('response has sended!');
});
module.exports=app;
一般一個請求所匹配的所有中介軟體的執行函式除最後一個執行函式外都要呼叫next,否則後面的執行函式或中介軟體將無法執行,若res還未發出請求將會掛起,(其後的中介軟體也無法執行,即前面中介軟體的每個執行函式都有呼叫next,否則將不會再往後執行),若當前函式沒有處理res 則會出現請求掛起,如把第二個中介軟體的next()刪除後執行。若前面的函式或中介軟體已經將res發出,則後面的函式或中介軟體將不能在對res的header進行設定,否則會報錯,如把app.js改為:
var express=require('express');
var app=express();
var f1=function(req,res,next){
console.log('firstMiddleware f1');
next();
};
var f2=function(req,res,next){
console.log('firstMiddleware f2');
next();
};
app.use(f1,f2);
app.use('/hello',function(req,res,next){
console.log('hello middleware');
res.send('response has sended!');
next();
});
app.use(function(req,res,next){
console.log('secondMiddleware');
res.set({
'Content-Type':'text/plain',
'Content-Length':'123',
'ETag':'12345'
})
})
module.exports=app;
當以上的程式碼執行時,傳送請求會出現res已經發送不能對res的header進行設定的錯誤。
---------------------------------------------------------------------------------------------------------------------
未完待續!
關於express中介軟體的詳細介紹請到:express中介軟體使用
相關推薦
關於express中介軟體的簡要解析之應用級、路由級中介軟體(一)
Express 是一個自身功能極簡,完全是由路由和中介軟體構成一個的 web 開發框架:從本質上來說,一個 Express 應用就是在呼叫各種中介軟體。中介軟體(Middleware) 是一個函式,它可以訪問請求物件(request object (req)
從零開始構建部署上線Node.js+Express+Bootstrap+Jade響應式網站應用—RSPT丨留學生活第一站(三)
一、Nodejs 線上伺服器部署與釋出綜述 伺服器配置生產環境所需要的步驟大致為: 整個專案部署詳細流程文字解析: 部署流程圖依照學習課程的流程: 看著這個圖,Scott老師有一段精彩的故事詮釋它: 故事還得從左下腳的角落開始,一把椅子
『高級篇』docker之服務發現、部署更新和擴容(七)
所有 gem 測試 域名解析 cbc 代碼更新 mage ftp dock >原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!>原文鏈接地址:『高級篇』docker之服務發現、部署更新和擴容(七) 服務發現 所有的表現形式都是ip+端口的形式。
Android解析HTML網頁數據 第一個方法Jsoup(一)
原生 日誌 href attr mage connect auto htm baidu 最近發現一些無聊的東西,就是抓取網頁上的數據,然後使用安卓原生代碼顯示出來,或者說借用網頁數據,用自定義的View顯示。 借助jsoup-1.10.2.jar庫,獲取並解析數據。(Jso
linux驅動開發之蜂鳴器驅動源碼分析(一)
linux 蜂鳴器 驅動 蜂鳴器的驅動源碼在/driver/char/buzzer/x210-buzzer.c文件中,源碼如下#include <linux/module.h> #include <linux/kernel.h> #include <linux
Android應用開發:網絡工具——Volley(一)
要求 com 庫文件 urn welcom 順序 之前 air tin 引言 網絡一直是我個人的盲點,前一陣子抽空學習了一下Volley網絡工具的用法,也透過源代碼進行了進一步的學習,有一些心得想分享出來。在Android開發中,成熟的網絡工具不少,And
硬件傳輸模塊系列之藍牙模塊無線上傳(一)
名稱 支持 藍牙連接 關閉 輸入 配對 藍牙 沒有 串口 藍牙模塊HC-06 知識點一:藍牙狀態 led指示藍牙連接狀態,閃爍表示沒有藍牙連接,常亮表藍牙已連接並打開串口(端口) 知識點二:相關參數 輸入電壓3.6v-6V,未配對時電流30mA,配對成功後為10mA。 未建
多線程編程之Linux環境下的多線程(一)
posix you host 說明 通過 常用 新的 變量 func 一、Linux環境下的線程 相對於其他操作系統,Linux系統內核只提供了輕量級進程的支持,並未實現線程模型。Linux是一種“多進程單線程”的操作系統,Linux本身只有進程的概念,而其所謂的“線程
13.Django之數據庫models&orm初探(一)
try api 示例 mar 叠代 交互 reverse 一行 gre 一、使用django orm的準備操作。django 默認支持sqlite,mysql, oracle,postgresql數據庫。在默認情況下django的項目中會默認使用sqlite數據庫,在打開s
使用XStream解析復雜XML並插入數據庫(一)
針對 很多 trac ota print root parser 沒有 jdbc 環境: Springboot+mysql 我只想說jpa真的超級好用,準備深入研究一下~ 導入依賴: <dependency> <groupId>org.proj
【數學之美筆記】自然語言處理部分(一).md
strip BE 模擬 ges arr 實驗 語句 次數 而不是 文字、數字、語言 、信息 數字、文字和自然語言一樣,都是信息的載體,他們的產生都是為了記錄和傳播信息。 但是貌似數學與語言學的關系不大,在很長一段時間內,數學主要用於天文學、力學。 本章,我們將回顧一下信息時
高並發與高可用實戰之基礎知識大型網站架構特征(一)
電商系統 保障系統 iptables ID 失敗重試 容量 設計原則 服務調用 冪等 大型網站架構特征: 1.高並發?(用戶訪問量比較大) 解決方案:拆分系統、服務化、消息中間件、緩存、並發化 高並發設計原則 系統設計不僅需要考慮實現業務功能,還要保證系統高並發、高
深入玩轉K8S之業務彈性伸縮和滾動更新操作(一)
nginx 副本 mil 容器 history 博客 limit 新的 ima 在實際應用場景中避免不了因為業務的壓力而增加容器數量以及業務應用版本叠代更新,那麽本篇文章我們來學習下簡單的業務彈性伸縮、滾動更新操作,滾動操作的好處在於零停機更新,也就是說每次更新一小部分副本
《JavaScript高級程序設計》讀書筆記(一)JavaScript簡介
範圍 應用程序編程接口 分辨率 移動 views 標記語言 語句 AMM mode 起於客戶端數據驗證特性----閉包----匿名函數----元編程等----等想要全面理解和掌握JavaScript----本質----歷史----局限性 ECMAScript 腳本語言標準
計算機網絡之鏈路狀態路由選擇算法(LS)
alt 一次 更新 最小 fff nag 狀態 imu n) 一、準備知識 ????????鏈路狀態路路由選擇算法是一種全局式路由選擇算法。在此算法中,我們是假設所有網絡拓撲和鏈路費用都是已知的(實踐中通常是通過讓每個結點向網絡中所有其他節點廣播鏈路狀態分組來完成的)【OS
linux學習之多高並發服務器篇(一)
多線程 同步 https 進程調度 creat server side lis logs 高並發服務器 高並發服務器 並發服務器開發 1.多進程並發服務器 使用多進程並發服務器時要考慮以下幾點: 父最大文件描述個數(父進程中需要close關閉accept返回的新文件
前端開發框架總結之利用Jtopo實現網路拓撲功能(一)
前端開發框架總結之利用Jtopo實現網路拓撲功能(一) 前言: 前段時間由於專案需要實現一個網路裝置拓撲管理的
DeepFM演算法解析及Python實現 FFM演算法解析及Python實現 FM演算法解析及Python實現 詞嵌入的那些事兒(一)
1. DeepFM演算法的提出 由於DeepFM演算法有效的結合了因子分解機與神經網路在特徵學習中的優點:同時提取到低階組合特徵與高階組合特徵,所以越來越被廣泛使用。 在DeepFM中,FM演算法負責對一階特徵以及由一階特徵兩兩組合而成的二階特徵進行特徵的提取;DNN演算法負責對由輸入的一階特徵進行全連線
演算法工程師修仙之路:吳恩達機器學習(一)
吳恩達機器學習筆記及作業程式碼實現中文版 第一章 緒論:初識機器學習 什麼是機器學習 Machine Learning(機器學習)是研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。 機器學習被用
學習筆記之使用LNMP安裝DISCUZ論壇系統簡述(一)
① 首先使用yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel fontconfig fontconfig-devel freetype f