Koa中介軟體

2022-08-03 12:51:17 字數 4265 閱讀 7781

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.應用中介軟體

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');

});

2.路由中介軟體

router.get('/', async(ctx, next)=>)

router.get('/', function (ctx) )

3.錯誤處理中介軟體next();

if(ctx.status==404)

});

const bodyparser = require('koa-bodyparser');

實現乙個基於 jsonwebtoken 驗證token的中介軟體,這個中介軟體由兩個檔案組成 extractors.js 、index.js,並放到check-jwt資料夾下。

生成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

使用 jwt.sign 生成token:

第乙個引數為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解密的資訊

route.get('/getuser', async ctx=> = ctx.payload 

ctx.body =

})

通過ctx.payload來獲取解密的資訊

資源搜尋**大全

廣州vi設計公司

實現**

extractors.js 工具函式(用於提取token)

let 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

index.js  驗證token

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 應用中處理請求 響應迴圈流程中的中...