一直以爲express
的中間件系統這種流式處理很是形象,就好像加工流水線同樣,每一個環節都在針對同一個產品的不一樣部分完成本身的工做,最後獲得一個成品。今天就來實現一個簡易的【中間件隊列】。node
初始化方法web
let middleware = new MiddleWare();
添加中間件函數的方法express
//Fn爲被添加的中間件 middleware.use(Fn);
啓動中間件隊列服務器
middleware.start(req, res);
class MiddleWare{ constructor(){ this.queue = [];//用來存放中間件隊列 } //添加中間件 use(fn){ this.queue.push(fn);//將自定義中間件加入隊列 } //按次序執行中間件 start(req, res){ let i = 0;//執行指針 //執行器 const next = (err)=>{ //若是有錯誤就將錯誤信息掛在response上並直接退出 if(err){ res.hasError = true; res.data = err.toString(); return; } //若是沒有錯誤就查看是否到達隊尾,若沒到則繼續執行下一個中間件 if(i < this.queue.length){ this.queue[i++](req, res, next); /*將next直接傳入當前執行的函數做爲回調 當前執行函數執行到任何一步,經過主動調用next方法便可將相關信息傳給下一個中間件。*/ }else{ //若是已經到隊尾了則結束 console.log('finish'); } } //啓動第一個 next(); } }
//添加第一個中間件 /* 此處演示了一個基本的錯誤捕捉的寫法,當中間件中出現錯誤時,會捕捉到錯誤並傳入next */ middleware.use(function(req, res, next){ try{ req.addon1 = 'I add something'; }catch(err){ next(err); } next(); }); //添加第二個中間件 middleware.use(function(req, res, next){ res.addon2 = 'I add something more'; next(); }); //添加第三個中間件 middleware.use(function(req, res, next){ if (req.addon2) { delete req.addon2; } res.addon3 = 'I add something a lot'; next(); });
「消費」這個詞是最近學到的,以爲很裝X,因此也在這裏裝一下~ide
let req = {}; let res = {}; let result = middleware.start(req,res); console.log(req, res);
能夠看到有錯誤發生和正常響應時的不一樣結果:函數
用node
起一個web服務器那真是太隨意了~ui
const http = require('http'); //上面的一堆代碼 http.createServer(function(req, res){ let result = {}; middleware.start(req, result); res.end(JSON.stringify(result)); }).listen(9527);
看一下效果(訪問服務器時自定義消息就能夠傳至前臺了):this