上一篇内容
实现express中间件的源码
本篇文章的目的
实现错误中间件及params
思路
- 错误中间件思路:
- 每次调用next方法,判断是否传递err参数。
- 如果err存在,则查询当前路由池中的索引是否为错误中间件。
- 如果是错误中间件,执行回调函数。
- 如果不是错误中间件,继续调用next并传递错误信息。
- params思路:
- 判断请求路径是否含查询参数,如果包含将参数名提取出来并将路径转化成一个正则。
- 当请求到来时,将储存的正则与请求路径进行匹配。
- 如果匹配成功,将保存的参数名与对应的参数值组成对象赋给req。
- 如果匹配失败,执行next();
代码
错误中间件
12345678910//在next函数中if (err) {//判断是否是错误中间件, 依据是错误中间件有4个形参if (route.method=='middleware'&&route.fn.length==4) {route.fn(err,req,res,next);} else {//不是错误中间件,将错误继续传递下去next(err);}}查询参数
12345678910111213141516171819202122232425262728293031323334353637//首先在方法对应函数中设置对查询参数的保存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();}}