express源码实现3——错误中间件及params

上一篇内容

实现express中间件的源码

本篇文章的目的

实现错误中间件及params

思路

  • 错误中间件思路:
  1. 每次调用next方法,判断是否传递err参数。
  2. 如果err存在,则查询当前路由池中的索引是否为错误中间件。
  3. 如果是错误中间件,执行回调函数。
  4. 如果不是错误中间件,继续调用next并传递错误信息。
  • params思路:
  1. 判断请求路径是否含查询参数,如果包含将参数名提取出来并将路径转化成一个正则。
  2. 当请求到来时,将储存的正则与请求路径进行匹配。
  3. 如果匹配成功,将保存的参数名与对应的参数值组成对象赋给req。
  4. 如果匹配失败,执行next();

    代码

  • 错误中间件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //在next函数中
    if (err) {
    //判断是否是错误中间件, 依据是错误中间件有4个形参
    if (route.method=='middleware'&&route.fn.length==4) {
    route.fn(err,req,res,next);
    } else {
    //不是错误中间件,将错误继续传递下去
    next(err);
    }
    }
  • 查询参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //首先在方法对应函数中设置对查询参数的保存
    methods.forEach(function (method) {
    app[method]=function (path,fn) {
    var config={method:method,path:path,fn:fn};
    }
    //如果路径中含查询参数
    if (path.includes(':')) {
    var params=[];
    config.path=path.replace(/:([^\/]+)/g,function () {
    //保存参数值
    params.push(arguments[1]);
    //返回一个正则,匹配非/ ,用来在请求中匹配
    return '([^\/]+)';
    })
    config.params=params;
    }
    app.routes.push(config);
    })
    //在next函数中,判断当前路由是否含查询参数
    if (route.params) {
    //当前请求与保存的带正则的路由路径匹配
    var matcher=req.path.match(new RegExp(route.path));
    //如果匹配上
    if (matcher) {
    //创建params对象
    var obj={};
    route.params.forEach(function (item,index) {
    obj[item]=matcher[index+1]
    })
    req.params=obj;
    route.fn(req,res);
    //没有匹配上
    } else {
    next();
    }
    }