1. 程式人生 > >【nodeJs】koa中介軟體的基本用法

【nodeJs】koa中介軟體的基本用法

一、什麼是Koa的中介軟體

通俗的講:中介軟體就是匹配路由之前或者匹配路由完成做的一系列的操作,我們就可以把它叫做中介軟體。

在express中介軟體(Middleware) 是一個函式,它可以訪問請求物件(request object (req)), 響應物件(response object (res)), 和 web 應用中處理請求-響應迴圈流程中的中介軟體,一般被命名為 next 的變數。

中介軟體的功能包括:

執行任何程式碼。
修改請求和響應物件。
終結請求-響應迴圈。
呼叫堆疊中的下一個中介軟體。

如果回撥函式中,沒有next引數,那麼匹配上第一個路由,就不會往下匹配了。如果想往下匹配的話,那麼需要寫next()

二、Koa應用可使用如下幾種中介軟體:

應用級中介軟體
路由級中介軟體
錯誤處理中介軟體
第三方中介軟體

1.應用級中介軟體

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();
app.use(async (ctx,next)=>{
    console.log(new Date());
    await next();
})
router.get('/', function (ctx, next) {
    ctx.body="Hello koa"
; })
router.get('/news',(ctx,next)=>{ ctx.body="news頁面" }); app.use(router.routes()); //作用:啟動路由 app.use(router.allowedMethods()); //作用: 當請求出錯時的處理邏輯 app.listen(3000,()=>{ console.log('starting at port 3000'); });

2、路由中介軟體

router.get('/', async(ctx, next)=>{
    console.log(1)
    next();  //傳遞給下一個中介軟體
})
router.get('/', function (ctx) { ctx.body="Hello koa"; })

3、錯誤處理中介軟體

app.use(async (ctx,next)=> {
    await next();
    if(ctx.status==404){
        ctx.body="這是一個404頁面";
    }
});

4、第三方中介軟體

const static = require('koa-static'); 
const staticPath = './static'; 
app.use(static(path.join( __dirname, staticPath))) 

const bodyParser = require('koa-bodyparser');
app.use(bodyParser());

三、Koa中介軟體的執行順序

Koa 的中介軟體和 Express 不同,Koa 選擇了洋蔥圈模型。 如下圖:
這裡寫圖片描述
可以通過一個例子來理解洋蔥模型:

const Koa = require('koa');
const app = new Koa();

const Router = require('koa-router');
const router = new Router();


app.use(async (ctx, next) => {    //匹配任何路由的中介軟體
    console.log('<1');
    next();
    console.log('1>');
})
app.use(async (ctx, next) => {   
    console.log('<2');
    next();
    console.log('2>');
})
app.use(async (ctx, next) => {  
    console.log('<3');
    next();
    console.log('3>');
})

router.get('/', async ctx=> {
    ctx.body = 'hello World';
})

app
  .use(router.routes())  //啟動路由
  .use(router.allowedMethods());  //自動幫你設定響應頭


app.listen(3000, function () {
    console.log('server start at 3000');
});

請求localhost:3000可以看到控制檯的訊息:
這裡寫圖片描述