本文主要学习 Egg.js 中的中间件。Egg 是对 Koa 的二次封装,所以中间件这部分和 Koa 框架是一样的,也遵循洋葱圈模型。
中间件的编写
Egg.js 约定中间件要写在/app/middleware
文件夹下面,如果没有middleware
可以自己建立。在文件夹下,新建一个counter.js
的文件。我们来作一下访问页面的次数这样的计数器。由于我们还没学数据库,所以把这个计数器的值保存在 Session 当中。
module.exports = options =>{ return async (ctx,next)=>{ if(ctx.session.counter){ ctx.session.counter++ }else{ ctx.session.counter=1 } await next(); } };
中间件的全局使用
写完这个之后,我们需要手动的挂载中间件。挂载方法是打开/config/config.default.js
文件。
config.middleware = ['counter'];
这样配置之后,就是全局的中间件,无论访问那个页面,计数器都会增加。为了看到效果。分别在appcontrollerhome.js
文件的index()
方法中 和 appcontrollermybj.js
的index()
方法中,加入控制台输出代码。
console.log(ctx.session.counter);
然后分别访问这两个页面,每次刷新页面就会在终端看到 session 都会增加。这就说明了中间件现在的作用域是全局的。
router 中间件的使用
如果只想让访问/my
时,计数器才会增加,这时候就要使用在 router(路由)中配置中间件的使用。直接在approuter.js
中实例化和挂载。
我们先去掉全局的挂载,然后到router.js
文件中挂载单个路由。
'use strict'; module.exports = app => { const counter = app.middleware.counter() const { router, controller } = app; router.get('/', controller.home.index); router.get('/my', counter, controller.mybj.index); };
这时候在访问首页,计数器虽然会显示,但是不会增加。只有在访问/my
路径的时候才会继续增加。也就是说中间件才会起作用。
我这里使用的中间件非常简单,在实际开发中中间件还是有很多用处的,比如日志的记录、比如所有页面的 Gzip 压缩展示、比如全局埋点的使用。以后在实战项目中,我们还会学习更多的中间件使用方法。