前言

狭义中间件,请求/拦截 最显著的特征是

  • 直接被app.use()
  • 拦截请求
  • 操作响应

最简单的场景是 Koa.js 官方支持传输静态文件中间件的实现koa-logger

本节主要以官方的 koa-logger 中间件为参考,实现了一个最简单的koa-logger 实现,方便原理讲解和后续二次自定义优化开发。

实现步骤

  • step 01 拦截请求,打印请求URL
  • step 02 操作响应,打印响应URL

    实现源码

    https://github.com/chenshenhai/koajs-design-note/tree/master/demo/chapter-04-01
    1. ## 安装依赖
    2. npm i
    3. ## 执行 demo
    4. npm run start
    5. ## 最后启动chrome浏览器访问
    6. ## http://127.0.0.1:3000/hello
    7. ## http://127.0.0.1:3000/world
    8. ## 控制台显示结果
    9. <-- GET /hello
    10. --> GET /hello
    11. <-- GET /world
    12. --> GET /world

    解读

    1. const logger = async function(ctx, next) {
    2. let res = ctx.res;
    3. // 拦截操作请求 request
    4. console.log(`<-- ${ctx.method} ${ctx.url}`);
    5. await next();
    6. // 拦截操作响应 request
    7. res.on('finish', () => {
    8. console.log(`--> ${ctx.method} ${ctx.url}`);
    9. });
    10. };
    11. module.exports = logger

    使用

    1. const Koa = require('koa');
    2. const logger = require('./index');
    3. const app = new Koa();
    4. app.use(logger);
    5. app.use(async(ctx, next) => {
    6. ctx.body = 'hello world';
    7. });
    8. app.listen(3000, () => {
    9. console.log('[demo] is starting at port 3000');
    10. });

    附录

    参考

    https://github.com/koajs/logger