您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎么在koa2中使用中間件,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
使用
普通使用方法
需要注意的是引入的koa-router是一個方法,引入后需要執行這個方法。
const Koa = require('koa'); const app = new Koa(); const router = require('koa-router')(); // 配置路由url // 默認url router.get('/', async (ctx, next) => { ctx.body = 'Hello World'; }); // 自定義url router.get('/hello/:name', async (ctx, next) => { var name = ctx.params.name; ctx.response.body = \`<h2>Hello, ${name}!</h2>\`; }); // 注冊路由 app.use(router.routes(), router.allowedMethods());
也可以按需引入并注冊路由,可注冊多個路由。
不同請求下接收的參數獲取
router.get
通過ctx.query獲取參數
router.post
通過ctx.request.body獲取參數
動態路由 router.get('/:id', func)
通過ctx.params獲取參數
遍歷注冊router
首先引入nodejs中的fs模塊,使用fs的readdirSync方法獲取到指定目錄的所有文件名,遍歷引入路由模塊并注冊。
const fs = require('fs');
// fs.readdirSync 獲取指定目錄下的所有文件名稱,遍歷引入路由模塊并注冊 fs.readdirSync('./routes').forEach(route=> { let api = require(\`./routes/${route}\`); app.use(api.routes(), api.allowedMethods()); });
koa-router中的其它api
router.prefix(prefix) 添加url前綴
設置已經初始化的路由器實例的路徑前綴
router.prefix('/user'); router.post('/login', function(ctx, next) { ... }); // 實際路徑 /user/login
router.use(url|[url1,url2,...], (ctx, next) => {...}) 路由中間件
使用場景:我們通常需要通過驗證用戶和用戶權限來判定用戶是否能使用該接口,如果在每個接口都寫一次驗證非常麻煩且不好維護。這時我們就需要路由中間件先進行驗證,再執行下面操作。
router.use的第一個參數為一個路徑或者由多個需要使用中間件的路徑組成的數組(需要注意的是,如果路由設置了url前綴,需要在設置前綴后注冊中間件,參數中的url不需要設置前綴)。
router.use的第二個參數為函數,函數傳遞ctx和next兩個參數,可通過ctx進行權限驗證后,判斷是否執行next調用接口。這里特別需要注意的是函數使用next的時候需要添加await,如果不添加,在調用接口前,接口就會返回結果,前臺則無法獲取到數據。
// this is wrong app.use(function (ctx, next) { ctx.set("Access-Control-Allow-Origin", "\*"); next(); }); // this is right app.use(async function (ctx, next) { ctx.set("Access-Control-Allow-Origin", "\*"); await next(); });
koa-bodyparser處理post請求
處理post請求時,我們會遇到一個問題,無論是node的request對象還是koa的request對象,都沒辦法解析request的body,我們就需要下載并引入一個解析body的中間件koa-bodyparser,koa-bodyparser的具體配置詳見下面的說明,這里我們直接放入使用方式。
// 引入路由文件 const index = require('./routes/index.js'); const user = require('./routes/user.js'); // 引入解析request.body的中間件 const bodyparser = require('koa-bodyparser'); // 注冊bodyparser,需要注意,bodyparser的注冊一定要在router路由注冊之前 app.use(bodyparser({ enableTypes:\['json', 'form', 'text'\] })); ... // 注冊routes app.use(index.routes(), index.allowedMethods()); app.use(user.routes(), user.allowedMethods());
koa-bodyparser
如上所述,koa-bodyparser用于解析request.body,因為node和koa的request無法解析body。
下載
npm i koa-bodyparser
使用
const bodyparser = require('koa-bodyparser');
在注冊運行時,bodyparser方法中可傳入對象,作相應配置。
- enableTypes:解析器只在配置了enableTypes時解析請求類型,默認是['json', 'form']。
- encoding:請求編碼,默認是utf-8。
- formLimit:urlencoded body的imit如果主體最終大于此限制,則返回一個413錯誤代碼。默認是56 kb。
- jsonLimit:json主體的限制。默認是1 mb。
- textLimit:文本主體的限制。默認是1 mb。
- strict:當設置為true時,JSON解析器將只接受數組和對象。默認是正確的。參見正文中的嚴格模式。在嚴格模式下,ctx.request。body總是一個對象(或數組),這避免了很多類型判斷。但文本正文總是返回字符串類型。
- detectJSON:自定義json請求檢測函數。默認為null。
app.use(bodyparser({ detectJSON: function (ctx) { return /\\.json$/i.test(ctx.path); } }));
- extendTypes:支持擴展類型
app.use(bodyparser({ extendTypes: { json: \['application/x-javascript'\] // 解析application/x-javascript 類型 作為JSON字符串 } }));
- onerror:支持自定義錯誤句柄,如果koa-bodyparser拋出一個錯誤,您可以自定義響應如下:
app.use(bodyparser({ onerror: function (err, ctx) { ctx.throw('body parse error', 422); } }));
- disableBodyParser:可以通過設置ctx動態禁用body解析器。disableBodyParser = true。
app.use(async (ctx, next) => { if (ctx.path === '/disable') ctx.disableBodyParser = true; await next(); }); app.use(bodyparser());
koa-logger
請求響應監聽日志
下載
npm i koa-logger
使用
~~// 引入日志中間件 const logger = require('koa-logger'); // 注冊日志中間件 app.use(logger()); ~~
koa-session
用于Koa的簡單會話中間件。默認為基于cookie的會話,并支持外部存儲。
session
我們知道,http協議是無狀態的,當用戶進行登錄后,并不會保存賬戶密碼,如果我們需要維持用戶的登錄狀態,就需要使用一些方法。目前主流的用戶認證方法有基于token和基于session兩種方式。
基于token的認證可以使用koa-jwt中間件,基于session的認證則使用標題的koa-session。
下載
npm i koa-session
使用
app.js 入口文件中注冊session
const CONFIG = { key: 'koa:sess', /\*\* (string) cookie key (default is koa:sess) \*/ /\*\* (number || 'session') maxAge in ms (default is 1 days) \*/ // 狀態保存最大時間,默認為一天 maxAge: 86400000, autoCommit: true, /\*\* (boolean) 自動保存頭部 (default true) \*/ overwrite: true, /\*\* (boolean) 能否覆蓋 (default true) \*/ httpOnly: true, /\*\* (boolean) httpOnly or not (default true) \*/ signed: true, /\*\* (boolean) signed or not (default true) \*/ /\*\* (boolean) 強制在每個響應上設置會話標識符cookie。過期將重置為原始maxAge,重新設置過期倒計時。 (default is false) \*/ rolling: false, /\*\* (boolean) 當會話快過期時續訂會話,這樣我們可以始終保持用戶登錄。(default is false)\*/ renew: false, }; // 如果你所有都為默認配置,則不需要傳遞配置參數,app.use(session(app))即可 app.use(session(sessionConfig, app));
session的使用
注冊后可以通過上下文ctx找到session屬性,下面代碼將用戶信息存入session屬性中,并創建key和value
user.js
// 用戶登錄 static async login(ctx, next) { const data = ctx.request.body const schema = Joi.object().keys({ username: Joi.string().required(), password: Joi.string().required(), }) let result = Joi.validate(data, schema) // 如果有字段類型錯誤 if(result.error) { return ctx.response.body = { status: 400, msg: result.error.details}; } let { username, password } = result.value // 驗證過后的數據 // 查找是否有該用戶 const userInfo = await usersModel.findByName(username) // 如果有該用戶,繼續驗證密碼是否正確 if (userInfo) { const userInfo2 = await usersModel.findOne({ username, password }) if (userInfo2) { ctx.response.body = {state: 200, msg: '登錄成功'} // 設置session ctx.session.userInfo = userInfo2 } else { ctx.response.body = {state: 410, msg: '密碼錯誤'} } // 如果沒有該用戶,返回結果 } else { ctx.response.body = {state: 410, msg: '該用戶不存在'} } return ctx.response.body }
koa-router路由中間件中驗證session,這里需要注意的是next()方法前一定要使用await,不然程序不會等待next()方法執行。
export const verifyUser = async (ctx, next) => { if (ctx.session.userInfo) { await next() } else { return ctx.response.body = { state: 401, msg: '無權限訪問' } } }
koa2-cors
用于解決跨域問題
下載
npm install koa2-cors
使用
app.use(cors())
上述就是小編為大家分享的怎么在koa2中使用中間件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。