koa 應用程式是乙個包含一組中介軟體函式的物件,它是按照類似堆疊的方式組織和執行的。當乙個中介軟體呼叫 next() 則該函式暫停並將控制傳遞給定義的下乙個中介軟體。當在下游沒有更多的中介軟體執行後,堆疊將展開並且每個中介軟體恢復執行其上游行為。
以上兩句話,是我在官方文件中找到其對 koa 中介軟體的描述。在koa中,中介軟體是乙個很有意思的設計,它處於request和response中間,被用來實現某種功能。像上篇文章所使用的 koa-router 、koa-bodyparser 等都是中介軟體。
單看中介軟體有堆疊執行順序的特點,兩者就出現質的區別。
這張圖是 koa 中介軟體執行順序的圖示,被稱為「洋蔥模型」。中介軟體按照棧結構的方式來執行,有「先進後出「的特點。
一段簡單的**來理解上圖:
console.log('--> 1')
next()
console.log('
}) console.log('--> 2')
//這裡有一段非同步操作
await new promise((resolve)=>)
await next()
console.log('
}) console.log('--> 3')
next()
console.log('
})
console.log('--> 4')
}) 當我們執行這段**時,得到以下結果
--> 1--> 2
--> 3
--> 4
中介軟體通過呼叫 next 一層層執行下去,直到沒有執行權可以繼續傳遞後,在以冒泡的形式原路返回,並執行 next 函式之後的行為。可以看到 1 第乙個進去,卻是最後乙個出來,也體現出中介軟體棧執行順序的特點。
在第二個中介軟體有一段非同步操作,所以要加上await,讓執行順序按照預期去進行,否則可能會出現一些小問題。
1.應用中介軟體
2.路由中介軟體const koa = require('koa');
const router = require('koa-router');
const router = new router();
console.log(new date());
await next();
})router.get('/', function (ctx, next) )
router.get('/news',(ctx,next)=>);
console.log('starting at port 3000');
});
3.錯誤處理中介軟體next();router.get('/', async(ctx, next)=>)
router.get('/', function (ctx) )
if(ctx.status==404)
});
實現乙個基於 jsonwebtoken 驗證token的中介軟體,這個中介軟體由兩個檔案組成 extractors.js 、index.js,並放到check-jwt資料夾下。const bodyparser = require('koa-bodyparser');
生成token
使用 jwt.sign 生成token:const router = require('koa-router')
const route = new router()
const jwt = require('jsonwebtoken')
route.get('/gettoken', async (ctx)=> = ctx.query
if(!name && !id)
return
}//生成token
let token = jwt.sign(,'secret',)
ctx.body =
})module.exports = route
第乙個引數為token中攜帶的資訊;
第二個引數為key標識(解密時需要傳入該標識);
第三個為可選配置選項,這裡我設定過期時間為一小時;
詳細用法可以到npm上檢視。
使用中介軟體
是否必選const = require('./check-jwt')
jwtfromrequest: extractors.frombodyfield('token'),
secretorkeyl: 'secret',
safetyroutes: ['/user/gettoken']
}))
接收型別
備註jwtfromrequest否函式
預設驗證 header 的 authorization
extractors提供的提取函式,支援get、post、header方式提取
這些函式都接收乙個字串引數(需要提取的key)
對應函式:
fromurlqueryparameter、
frombodyfield、
fromheader
secretorkey
是字串與生成token時傳入的標識保持一致
safetyroutes否陣列
不需要驗證的路由
使用該中介軟體後,會對每個路由都進行驗證
路由中獲取token解密的資訊
通過ctx.payload來獲取解密的資訊route.get('/getuser', async ctx=> = ctx.payload
ctx.body =
})
資源搜尋**大全
廣州vi設計公司
實現**
extractors.js 工具函式(用於提取token)
index.js 驗證tokenlet extractors = {}
extractors.fromheader = function(header_name='authorization')else 不合法`,
code: 0}}
return token;
}}extractors.fromurlqueryparameter = function(param_name)else 不合法`,
code: 0}}
return token;
}}extractors.frombodyfield = function(field_name)else 不合法`,
code: 0}}
return token;
}}module.exports = extractors
const jwt = require('jsonwebtoken')
const extractors = require('./extractors')
/** *
* @param options
* @param jwtfromrequest
* @param safetyroutes
* @param secretorkey
*/function checkjwt(={})`);
//若匹配到當前路由 則直接跳過 不開啟驗證
if(reg.test(url))
}}else
}if(typeof secretorkey === 'undefined')
if(typeof jwtfromrequest === 'undefined')
let token = jwtfromrequest(ctx)
if(token)
resolve(err)
})})
if(err)
return
}await next()}}
}module.exports =
koa 中介軟體
什麼是中介軟體 中介軟體是匹配路由之前或匹配路由完成做的一系列操作 中介軟體是乙個函式,它可以訪問請求物件和響應物件,和web應用中處理請求 響應迴圈流程 變數next,呼叫它,將控制權交給下乙個中介軟體函式 中介軟體的功能 koa中的幾種中介軟體 應用級中介軟體 路由級中介軟體 錯誤處理中介軟體 ...
koa 中介軟體
什麼是 koa 的中介軟體 通俗的講 中介軟體就是匹配路由之前或者匹配路由完成做的一系列的操作,我們就可以 把它叫做中介軟體。在express中介軟體 middleware 是乙個函式,它可以訪問請求物件 requestobject req 響應物件 responseobject res 和 web...
koa 中介軟體
中介軟體就是匹配路由之前或者匹配路由完成做的一系列的操作,我們就可以把它叫做中介軟體。在express 中介軟體 middleware 是乙個函式,它可以訪問請求物件 request object req 響應物件 response object res 和web 應用中處理請求 響應迴圈流程中的中...