eggjs中间件的初步学习

  1. 定义中间件
    在eggjs中,定义中间件需要写到app/middleware目录下(没有middleware则自己创建一个),创建一个JS文件,每一个JS就是一个中间件,可以多个中间件同时使用
    基本的写法如下

    //1、在js中,暴露一个方法
module.exports = (options, app) => {
    //2、返回一个异步的函数
    return async function login(ctx, next) {
    console.log('hello middleware');
    await next();
    }
}
  1. 配置中间件
  • 当你在定义好中间件后在config/config.default.js会自动生成一个config.middleware=[]你只需要在中括号内写下你的js文件名,这即为配置好中间件。
  • 如果你的中间件需要传递参数,可以通过config.login来进行参数的传递,在中间件件可以通过options接收传递过来的参数
  config.中间件名= {
    data: '给中间件传递的参数!'
  }
  1. 在框架和插件中使用中间件
    框架和插件不支持在 config.default.js 中匹配 middleware,需要通过以下方式:
// app.js
module.exports = app => {
  // 在中间件最前面统计请求时间
  app.config.coreMiddleware.unshift('report');
};

// app/middleware/report.js
module.exports = () => {
  return async function (ctx, next) {
    const startTime = Date.now();
    await next();
    // 上报请求时间
    reportTime(Date.now() - startTime);
  }
};

应用层定义的中间件(app.config.appMiddleware)和框架默认中间件(app.config.coreMiddleware)都会被加载器加载,并挂载到 app.middleware 上。

  1. router 中使用中间件
    以上两种方式配置的中间件是全局的,会处理每一次请求。 如果你只想针对单个路由生效,可以直接在 app/router.js 中实例化和挂载,如下:
module.exports = app => {
  const gzip = app.middleware.gzip({ threshold: 1024 });
  app.router.get('/needgzip', gzip, app.controller.handler);
};

你可能感兴趣的:(eggjs中间件的初步学习)