精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:說說對(duì)中間件概念的理解,如何封裝 node 中間件?

系統(tǒng)
中間件(Middleware)是介于應(yīng)用系統(tǒng)和系統(tǒng)軟件之間的一類軟件,它使用系統(tǒng)軟件所提供的基礎(chǔ)服務(wù)(功能),銜接網(wǎng)絡(luò)上應(yīng)用系統(tǒng)的各個(gè)部分或不同的應(yīng)用,能夠達(dá)到資源共享、功能共享的目的。

[[405569]]

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

 

一、是什么

中間件(Middleware)是介于應(yīng)用系統(tǒng)和系統(tǒng)軟件之間的一類軟件,它使用系統(tǒng)軟件所提供的基礎(chǔ)服務(wù)(功能),銜接網(wǎng)絡(luò)上應(yīng)用系統(tǒng)的各個(gè)部分或不同的應(yīng)用,能夠達(dá)到資源共享、功能共享的目的

在NodeJS中,中間件主要是指封裝http請(qǐng)求細(xì)節(jié)處理的方法

例如在express、koa等web框架中,中間件的本質(zhì)為一個(gè)回調(diào)函數(shù),參數(shù)包含請(qǐng)求對(duì)象、響應(yīng)對(duì)象和執(zhí)行下一個(gè)中間件的函數(shù)

在這些中間件函數(shù)中,我們可以執(zhí)行業(yè)務(wù)邏輯代碼,修改請(qǐng)求和響應(yīng)對(duì)象、返回響應(yīng)數(shù)據(jù)等操作

二、封裝

koa是基于NodeJS當(dāng)前比較流行的web框架,本身支持的功能并不多,功能都可以通過中間件拓展實(shí)現(xiàn)。通過添加不同的中間件,實(shí)現(xiàn)不同的需求,從而構(gòu)建一個(gè) Koa 應(yīng)用

Koa 中間件采用的是洋蔥圈模型,每次執(zhí)行下一個(gè)中間件傳入兩個(gè)參數(shù):

ctx :封裝了request 和 response 的變量

next :進(jìn)入下一個(gè)要執(zhí)行的中間件的函數(shù)

下面就針對(duì)koa進(jìn)行中間件的封裝:

Koa的中間件就是函數(shù),可以是async 函數(shù),或是普通函數(shù)

  1. // async 函數(shù) 
  2. app.use(async (ctx, next) => { 
  3.   const start = Date.now(); 
  4.   await next(); 
  5.   const ms = Date.now() - start; 
  6.   console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); 
  7. }); 
  8.  
  9. // 普通函數(shù) 
  10. app.use((ctx, next) => { 
  11.   const start = Date.now(); 
  12.   return next().then(() => { 
  13.     const ms = Date.now() - start; 
  14.     console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); 
  15.   }); 
  16. }); 

下面則通過中間件封裝http請(qǐng)求過程中幾個(gè)常用的功能:

token校驗(yàn)

  1. module.exports = (options) => async (ctx, next) { 
  2.   try { 
  3.     // 獲取 token 
  4.     const token = ctx.header.authorization 
  5.     if (token) { 
  6.       try { 
  7.           // verify 函數(shù)驗(yàn)證 token,并獲取用戶相關(guān)信息 
  8.           await verify(token) 
  9.       } catch (err) { 
  10.         console.log(err) 
  11.       } 
  12.     } 
  13.     // 進(jìn)入下一個(gè)中間件 
  14.     await next() 
  15.   } catch (err) { 
  16.     console.log(err) 
  17.   } 

日志模塊

  1. const fs = require('fs'
  2. module.exports = (options) => async (ctx, next) => { 
  3.   const startTime = Date.now() 
  4.   const requestTime = new Date() 
  5.   await next() 
  6.   const ms = Date.now() - startTime; 
  7.   let logout = `${ctx.request.ip} -- ${requestTime} -- ${ctx.method} -- ${ctx.url} -- ${ms}ms`; 
  8.   // 輸出日志文件 
  9.   fs.appendFileSync('./log.txt', logout + '\n'

Koa存在很多第三方的中間件,如koa-bodyparser、koa-static等

下面再來看看它們的大體的簡(jiǎn)單實(shí)現(xiàn):

koa-bodyparser

koa-bodyparser 中間件是將我們的 post 請(qǐng)求和表單提交的查詢字符串轉(zhuǎn)換成對(duì)象,并掛在 ctx.request.body 上,方便我們?cè)谄渌虚g件或接口處取值

  1. // 文件:my-koa-bodyparser.js 
  2. const querystring = require("querystring"); 
  3.  
  4. module.exports = function bodyParser() { 
  5.     return async (ctx, next) => { 
  6.         await new Promise((resolve, reject) => { 
  7.             // 存儲(chǔ)數(shù)據(jù)的數(shù)組 
  8.             let dataArr = []; 
  9.  
  10.             // 接收數(shù)據(jù) 
  11.             ctx.req.on("data", data => dataArr.push(data)); 
  12.  
  13.             // 整合數(shù)據(jù)并使用 Promise 成功 
  14.             ctx.req.on("end", () => { 
  15.                 // 獲取請(qǐng)求數(shù)據(jù)的類型 json 或表單 
  16.                 let contentType = ctx.get("Content-Type"); 
  17.  
  18.                 // 獲取數(shù)據(jù) Buffer 格式 
  19.                 let data = Buffer.concat(dataArr).toString(); 
  20.  
  21.                 if (contentType === "application/x-www-form-urlencoded") { 
  22.                     // 如果是表單提交,則將查詢字符串轉(zhuǎn)換成對(duì)象賦值給 ctx.request.body 
  23.                     ctx.request.body = querystring.parse(data); 
  24.                 } else if (contentType === "applaction/json") { 
  25.                     // 如果是 json,則將字符串格式的對(duì)象轉(zhuǎn)換成對(duì)象賦值給 ctx.request.body 
  26.                     ctx.request.body = JSON.parse(data); 
  27.                 } 
  28.  
  29.                 // 執(zhí)行成功的回調(diào) 
  30.                 resolve(); 
  31.             }); 
  32.         }); 
  33.  
  34.         // 繼續(xù)向下執(zhí)行 
  35.         await next(); 
  36.     }; 
  37. }; 

koa-static

koa-static 中間件的作用是在服務(wù)器接到請(qǐng)求時(shí),幫我們處理靜態(tài)文件

  1. const fs = require("fs"); 
  2. const path = require("path"); 
  3. const mime = require("mime"); 
  4. const { promisify } = require("util"); 
  5.  
  6. // 將 stat 和 access 轉(zhuǎn)換成 Promise 
  7. const stat = promisify(fs.stat); 
  8. const access = promisify(fs.access) 
  9.  
  10. module.exports = function (dir) { 
  11.     return async (ctx, next) => { 
  12.         // 將訪問的路由處理成絕對(duì)路徑,這里要使用 join 因?yàn)橛锌赡苁?nbsp;/ 
  13.         let realPath = path.join(dir, ctx.path); 
  14.  
  15.         try { 
  16.             // 獲取 stat 對(duì)象 
  17.             let statObj = await stat(realPath); 
  18.  
  19.             // 如果是文件,則設(shè)置文件類型并直接響應(yīng)內(nèi)容,否則當(dāng)作文件夾尋找 index.html 
  20.             if (statObj.isFile()) { 
  21.                 ctx.set("Content-Type", `${mime.getType()};charset=utf8`); 
  22.                 ctx.body = fs.createReadStream(realPath); 
  23.             } else { 
  24.                 let filename = path.join(realPath, "index.html"); 
  25.  
  26.                 // 如果不存在該文件則執(zhí)行 catch 中的 next 交給其他中間件處理 
  27.                 await access(filename); 
  28.  
  29.                 // 存在設(shè)置文件類型并響應(yīng)內(nèi)容 
  30.                 ctx.set("Content-Type""text/html;charset=utf8"); 
  31.                 ctx.body = fs.createReadStream(filename); 
  32.             } 
  33.         } catch (e) { 
  34.             await next(); 
  35.         } 
  36.     } 

三、總結(jié)

在實(shí)現(xiàn)中間件時(shí)候,單個(gè)中間件應(yīng)該足夠簡(jiǎn)單,職責(zé)單一,中間件的代碼編寫應(yīng)該高效,必要的時(shí)候通過緩存重復(fù)獲取數(shù)據(jù)

koa本身比較簡(jiǎn)潔,但是通過中間件的機(jī)制能夠?qū)崿F(xiàn)各種所需要的功能,使得web應(yīng)用具備良好的可拓展性和組合性

通過將公共邏輯的處理編寫在中間件中,可以不用在每一個(gè)接口回調(diào)中做相同的代碼編寫,減少了冗雜代碼,過程就如裝飾者模式

參考文獻(xiàn)

https://segmentfault.com/a/1190000017897279

https://www.jianshu.com/p/81b6ebc0dd85

https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BB%B6

 

責(zé)任編輯:武曉燕 來源: JS每日一題
相關(guān)推薦

2021-07-19 07:55:24

Redux中間件原理

2022-11-18 07:54:02

Go中間件項(xiàng)目

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發(fā)CRUD

2016-11-11 21:00:46

中間件

2018-07-29 12:27:30

云中間件云計(jì)算API

2018-02-01 10:19:22

中間件服務(wù)器系統(tǒng)

2020-08-19 08:39:05

中間件前端設(shè)計(jì)模式

2020-11-02 08:51:57

中間件和洋蔥模型

2009-06-16 15:55:06

JBoss企業(yè)中間件

2012-11-30 10:21:46

移動(dòng)中間件

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ

2020-11-06 09:24:09

node

2018-05-02 16:23:24

中間件RPC容器

2013-03-13 10:37:22

中間件Windows

2015-02-07 21:52:45

PaaS中間件

2012-11-01 15:16:22

金蝶中間件研究院院長(zhǎng)

2011-10-24 07:41:38

SOA中間件應(yīng)用服務(wù)器

2013-03-14 22:54:15

PaaS中間件平臺(tái)即服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

在线看欧美日韩| 欧美视频在线看| 大波视频国产精品久久| 日韩乱码在线观看| 黑丝美女一区二区| 欧美一区二区久久| 欧美午夜小视频| 四虎精品在永久在线观看| 日本成人在线电影网| 欧美另类暴力丝袜| 白白色免费视频| 欧洲大片精品免费永久看nba| 午夜国产精品一区| 亚洲视频导航| 天堂影院在线| 国产成人av网站| 国产日本欧美一区二区三区| 国产情侣在线视频| 国产精品精品国产一区二区| 亚洲欧美另类自拍| 男人女人拔萝卜视频| 国产一区二区三区朝在线观看| 亚洲精品国产高清久久伦理二区| 欧洲精品码一区二区三区免费看| 草草视频在线播放| 久久精品久久综合| 国产福利精品在线| 日韩三级免费看| 欧美精品黄色| 久久精品国产91精品亚洲| 蜜桃av免费看| 欧美偷窥清纯综合图区| 日韩一区二区三区精品视频| 亚洲综合在线网站| 色偷偷偷在线视频播放| 一区二区在线电影| 天天干天天操天天干天天操| 不卡在线视频| 久久久久久久久一| 久久国产精品久久精品国产| 亚洲欧美激情在线观看| 国产一区亚洲一区| 成人性生交大片免费看视频直播 | 国产精品久久色| 亚洲视频免费播放| 亚洲一级网站| 久久久久五月天| 免费在线观看黄视频| 一区二区蜜桃| 欧美成人精品在线播放| 妖精视频在线观看免费| 欧美手机在线| 色系列之999| 国产又粗又猛又爽又黄的视频四季| 欧美精品第一区| 亚洲欧洲自拍偷拍| 久久久视频6r| 欧美色爱综合| 中文字幕日韩在线播放| 老司机深夜福利网站| 欧美成人自拍| 久久国产精品偷| 青青草成人免费| 亚洲先锋成人| 26uuu日韩精品一区二区| www欧美在线| 日韩精品91亚洲二区在线观看| 国产精品久久久久久久久免费看| 国产精品无码粉嫩小泬| 久久99最新地址| 99re6在线| 日韩a在线观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 成人精品小蝌蚪| 九九九九精品九九九九| 青青草手机在线| 欧美国产禁国产网站cc| 伊人天天久久大香线蕉av色| 欧美性爽视频| 天天亚洲美女在线视频| 成人亚洲视频在线观看| 91视频亚洲| 亚洲黄在线观看| 少妇久久久久久久久久| 国产精品99视频| 国产69精品久久久久9999| 草久久免费视频| 免费不卡在线观看| 成人av电影免费| 精品av中文字幕在线毛片| 综合激情成人伊人| 国产91在线免费| 性欧美video另类hd尤物| 欧美丰满嫩嫩电影| 亚洲天堂资源在线| 欧美xxxx中国| 性色av一区二区三区红粉影视| 色老头一区二区| 国产精品18久久久久久久久久久久 | 久久99成人| 亚洲精品一区二区在线| 亚洲最大的黄色网址| 国产亚洲网站| 亚洲va男人天堂| 全部免费毛片在线播放网站| 亚洲欧洲成人自拍| 国产最新免费视频| 色播一区二区| 尤物九九久久国产精品的分类 | 欧美a级片一区| 国产精品18久久久久久麻辣| 亚洲精品人妻无码| 国产精品久线在线观看| 精品人妻一区二区三区四区在线| 精品一区二区三区中文字幕 | 欧美另类高清zo欧美| 精品夜夜澡人妻无码av| 黑人一区二区| 成人激情av在线| 国产三级在线观看| 精品二区三区线观看| wwwxxx色| 综合激情网站| 国产日韩精品入口| 风间由美一区| 日韩欧美成人精品| 中文在线永久免费观看| 国内自拍视频一区二区三区 | 蜜臀久久99精品久久久酒店新书| 成人直播在线观看| 欧美大肥婆大肥bbbbb| 夜夜爽8888| 国产免费成人在线视频| 91av在线免费播放| 竹菊久久久久久久| 57pao国产精品一区| www.精品久久| 亚洲天堂福利av| www.久久91| 日韩精品欧美| 国产美女直播视频一区| 77777影视视频在线观看| 91搞黄在线观看| 亚洲日本精品视频| 热久久一区二区| 亚洲欧美99| 久久久免费人体| 日韩在线观看你懂的| 这里只有精品9| 中文字幕一区三区| 在线播放av中文字幕| 欧美丰满日韩| 亚洲综合在线做性| 欧美寡妇性猛交xxx免费| 精品国产一区二区三区忘忧草| 亚洲国产美女视频| 国产盗摄视频一区二区三区| 亚洲熟妇无码av在线播放| 一区二区日韩| 97国产精品视频| 四虎国产精品永远| 欧美在线小视频| 亚洲 欧美 国产 另类| 韩国理伦片一区二区三区在线播放| 亚洲欧洲久久| 欧美视频三区| 欧美激情2020午夜免费观看| 人妻妺妺窝人体色www聚色窝 | 在线观看国产精品入口男同| 国产精品久久久久aaaa樱花| 色一情一区二区| 午夜天堂精品久久久久| 精品国产乱码久久久久久蜜柚| 中日韩脚交footjobhd| 亚洲无av在线中文字幕| 国产又粗又黄又爽的视频| 亚洲精品国产精华液| 亚洲成人av免费在线观看| 日韩电影在线一区| 神马午夜伦理影院| 天海翼精品一区二区三区| 国产精品成人一区二区三区吃奶 | 午夜精品福利电影| 精品美女视频在线观看免费软件| 欧美日韩三级视频| 国产精品7777| 国产日韩高清在线| 亚洲国产欧美日韩在线| 欧美中文日韩| 成年丰满熟妇午夜免费视频| 亚欧日韩另类中文欧美| 成人福利视频网| 一本大道色婷婷在线| 久久精品精品电影网| 天天干,夜夜爽| 欧美精品丝袜中出| 成年人免费高清视频| 亚洲三级小视频| 色婷婷av777| 国产精品77777| 999精彩视频| 亚洲成色精品| 五月天综合婷婷| 欧美欧美黄在线二区| 亚洲精品日韩av| 国产精品亚洲一区二区三区在线观看| 欧美成人第一页| 国产福利在线视频| 亚洲精品国产精品乱码不99按摩| 国产精品熟女久久久久久| 欧美午夜性色大片在线观看| 永久看片925tv| 亚洲国产精华液网站w| 日本一卡二卡在线| 国产91丝袜在线观看| 国产色视频在线播放| 日韩国产精品久久久| 97国产在线播放| 欧美日韩一区二区国产| 一区二区视频在线观看| 国产精品欧美在线观看| 激情小说综合区| 这里视频有精品| 91在线高清免费观看| 青青草国产一区二区三区| 国产91色在线免费| 制服丝袜专区在线| 性欧美xxxx交| 91美女主播在线视频| 欧美精品免费在线观看| a视频在线观看| 久久色在线播放| 日本免费中文字幕在线| 在线亚洲男人天堂| a黄色在线观看| 一夜七次郎国产精品亚洲| 欧美zozo| 亚洲欧洲一区二区三区久久| 欧洲天堂在线观看| 亚洲精品在线不卡| 欧美色图另类| 亚洲欧美日韩精品久久| 精品久久av| 国产亚洲一级高清| 97超碰国产一区二区三区| 亚洲一品av免费观看| 国产爆初菊在线观看免费视频网站 | 五月婷婷欧美视频| 精品在线小视频| 一级做a爰片久久毛片16| 亚洲自拍与偷拍| 少妇视频一区二区| 亚洲欧洲精品天堂一级| 91成人福利视频| 亚洲综合999| 久草免费在线观看视频| 亚洲高清不卡在线观看| 国产一级精品视频| 91国产免费观看| 国产乱码精品一区二三区蜜臂 | 国产又猛又黄的视频| 热久久免费视频| 四虎成人在线播放| 成人av电影在线观看| av在线网站观看| 欧美激情一区在线| 国产天堂av在线| 一区二区三区欧美日韩| 成人免费看片98欧美| 在线亚洲免费视频| 91福利在线观看视频| 欧美不卡一二三| 日韩欧美亚洲系列| 色av吧综合网| 手机在线免费观看av| 浅井舞香一区二区| 9999精品视频| 国产精品一区在线观看| 精品黄色一级片| 欧美做受777cos| 国产精品资源| 中文字幕资源在线观看| 成人激情免费电影网址| 免费看黄色的视频| 亚洲精品视频免费看| 丰满少妇乱子伦精品看片| 欧美日韩一区二区三区在线| 草草视频在线播放| 中文字幕日韩av| 欧美78videosex性欧美| 国产成人精品久久久| 日本一区二区乱| 欧美自拍资源在线| 亚洲无毛电影| www.com黄色片| www.久久精品| 久久99久久99精品免费看小说| 天天射综合影视| 国产免费av观看| 亚洲天堂精品在线| 成人性生交大片免费看在线播放| 国产精品激情av在线播放| 国产欧美三级电影| 黄瓜视频免费观看在线观看www | 国产不卡一区二区在线播放| 欧美二区观看| 日韩经典在线视频| 国产精品theporn| 日韩精品视频一二三| 久久夜色精品国产欧美乱极品| 玖玖爱免费视频| 欧美区一区二区三区| 欧美女v视频| 久久久久久久久综合| 精品一级视频| 这里只有精品66| 丝袜亚洲另类丝袜在线| 日韩免费高清一区二区| 亚洲精品v日韩精品| 91亚洲国产成人精品一区| 国产亚洲激情视频在线| 538在线精品| 成人激情av| 亚洲精品电影| 日本人69视频| 国产精品欧美极品| 波多野结衣在线电影| 亚洲欧美精品一区| www.com.cn成人| 六月婷婷久久| 亚洲少妇自拍| 亚洲 欧美 日韩在线| 亚洲国产精品自拍| 理论片中文字幕| 欧美韩国理论所午夜片917电影| 动漫一区二区三区| 色乱码一区二区三区熟女 | 91久久夜色精品国产网站| 欧美日中文字幕| 亚洲视频在线a| 欧美韩国一区二区| 中文在线免费观看| xxxxx成人.com| 伊人久久大香伊蕉在人线观看热v| 中文字幕中文字幕99| 国产在线视频精品一区| xxxx日本少妇| 精品国产sm最大网站| wwwww亚洲| 精品国产一区二区三区四区vr| 亚洲伦理精品| 日本一区二区三区网站| 色妹子一区二区| 婷婷视频在线| 91一区二区三区| 在线不卡视频| 国产毛片久久久久久久| 欧美性生活大片视频| 久久77777| 国产高清自拍一区| 亚洲视频大全| 男人的天堂官网 | 欧美一级特黄aaa| 亚洲人一二三区| 亚洲第一第二区| 91av视频导航| 精品国产91| 久久精品视频在线观看免费| 一区二区三区日韩精品视频| 日本美女一级视频| 国产精彩精品视频| 综合久久精品| 熟女人妻在线视频| 欧美视频三区在线播放| 1769免费视频在线观看| 国产一区二区三区四区hd| 日韩成人午夜电影| 日本中文字幕免费在线观看| 亚洲成人网av| 国产精品.xx视频.xxtv| 日本精品久久久久久久久久| 久久久亚洲高清| 97成人免费视频| 国产69精品久久久久99| 成人vr资源| wwwxx日本| 欧美日韩精品福利| 捆绑调教日本一区二区三区| 天天综合狠狠精品| 成人免费高清视频| 亚洲图片视频小说| 性色av一区二区咪爱| 国产精品国产三级国产在线观看 | 老司机精品视频在线播放| 欧美日韩亚洲自拍| 午夜电影网一区| 黄网站在线播放| 日韩欧美视频一区二区| 成人美女视频在线观看18| 一级黄色片视频|