(1). 什么是中间件
中间件就是:路由之前或者路由之后做的一系列操作(类似于Java中的Filter),可实现拦截判断. 中间件的功能包括:
- 执行任何代码.
- 修改请求和响应对象.
- 终结请求.
- 调用堆栈中的下一个中间件.
(2). app.js
// 引入koa
const Koa = require("koa");
// 引入koa-router
const Router = require('koa-router');
// 创建Koa实例
const app = new Koa();
// 创建Router实例
const router = new Router();
// 配置路由
// curl -X GET http://localhost:8080?name=zhgnsan
router.get('/', async (ctx, next) => {
let query = ctx.query;
// {name : "zhgnsan"}
ctx.body = 'GET Hello World! request param name:' + query.name;
});
// 配置动态路由
router.get('/get/:name', async (ctx, next) => {
let name = ctx.params.name;
ctx.body = "GET /get/" + name;
});
// **************************************应用级中间件**************************************
// app.use(function(){...}) 代表拦截所有的请求.
// app.use("/get/:name",function(){...}) 代表仅拦截/get/:name请求.
// app.use(async (ctx,next) => {
// let nowDate = new Date();
// let url = ctx.request.url;
// console.log(`
// ${nowDate} request before url:${url}
// `);
// // 继续执行下一个中间件(Filter)
// await next();
// });
// **************************************路由级中间件**************************************
// 路由是从上至下match的,当match到某一个了,就认为是命中了.而next代表继续往下执行.
// match到:/hello请求后,继续向下路由.
// router.get("/hello",async (ctx,next)=>{
// console.log("这是hello1");
// await next();
// });
// router.get("/hello",async (ctx,next)=>{
// ctx.body = "这是Hello2";
// await next();
// });
// **************************************错误处理中间件**************************************
// 如果页面找不到,则:404
// curl http://localhost:8080/xxx
app.use(async (ctx,next) => {
console.log(`request url:${ctx.request.url}`)
await next();
if(ctx.status == 404){
ctx.status = 404;
ctx.body = "这是一个404错误";
}
});
// 配置第三方中间件
app.use(router.routes()).use(router.allowedMethods());
// 监听端口
app.listen(8080);
(3). 运行
lixin-macbook:koa-example lixin$ node app.js
(4). 测试
// 404错误请求
lixin-macbook:~ lixin$ curl http://localhost:8080/xxx
这是一个404错误
(5). 总结
Koa里的中间件,和Java中的Filter一样.有请求之前或者请求之后,可进行一些处理.比如:权限拦截/请求日志记录.