渐进式Express源码学习6-独孤求败
这是渐进式Express源码学习 | 小白也能懂源码系列文章的第六篇。
请结合该节代码阅读Lesson6-独孤求败
目标特性和目标用法
这篇文章我们在第五篇文章的基础上,实现一个稍微加强版的Express,功能包括
- next可以向下传递错误对象
- 错误捕捉
这篇文章要实现的express的期望用法如下
const express = require('../index.js')
const app = express()app.get('/foo', function handle1 (req, res, next) {next(new Error('Bang!'))
}, function handle2 (req, res, next) {res.end('Will not go here')
}, function handle3 (err, req, res, next) {console.log(`Error Caught! Error message is ${err.message}`)next(err)
})app.get('/foo', function (req, res, next) {res.end('Will not go here too')
})app.use('/foo', function (req, res, next) {res.end('Will not go here too')
})app.get('/foo', function (err, req, res, next) {console.log(err.name)res.end('Will not go here too')
})app.use('/foo', function (err, req, res, next) {console.log(`Error Caught! Error message is ${err.message}`)res.end('Go here')
})app.listen(3000)
复制代码
在阅读这篇文章之前,请务必了解express错误处理,例如上面的例子中,你需要知道抛出的错误是在哪个环节捕捉的,否则阅读这个文章会吃力
源码及讲解
这一节,会引入两个概念,路由中间件和非路由中间件 新的章节,主要有3个变化
- lib/route/layer.js
- 增加handle_error
- lib/route/route.js
- 修改.dispatch函数
- 如果有error,调用layer.handle_error
- 如果没有error,调用layer.handle_request
- 修改.dispatch函数
- lib/route/index.js
- 增加use函数
- 调整handle函数
首先要讲解,路由中间件和非路由中间件。路由中间件,通过app.verb添加,结构是处理函数挂载到layer上,layer推送到route上,route的dispatch函数又挂载到一个新的layer,这个layer再推送到Router的stack中。 结构类似这样
而对于非路由中间件,直接挂载到layer上,然后推送到Router的stack 结构是这样的
所以,二者结合后,结构是这样的
理解了上面这些,我们看具体的代码 首先是lib/route/layer.js
他们的区别是如果你的layer的fn是function(req, res, next) ,调用这个layer的handle_error会直接掉过,只有当这个layer的fn是function(err, req, res, next)才会有效
再看lib/route/route.js
注意第44行到48行,route.dispatch函数会判断是否有error,如果有,调用layer的handler_error函数,这样正常的路由就会被跳过
再看lib/route/index.js
首先是增加了一个use函数,这个函数用来增加非路由中间件,直接创建一个layer,绑定函数后推送到stack
最后,看Router.handle,我们聚焦在next函数
看代码第55行,这个地方判断是否是路由中间件,如果layer有route属性,说明是路由中间件,否则不是。
在process_params里也是,如果有错误,调用layer.handle_error,否则调用handle_request。
本文总结及预告
本文实现了一个加强的Express。到目前为止,一个基本的Express已经实现了。和真实的Express相比,只是一些细节差异
渐进式Express源码学习6-独孤求败相关推荐
- express 源码阅读(全)
1. 简介 这篇文章主要的目的是分析理解express的源码,网络上关于源码的分析已经数不胜数,这篇文章准备另辟蹊径,仿制一个express的轮子,通过测试驱动的开发方式不断迭代,正向理解expres ...
- Android源码学习之浅析SystemServer脉络
在之前的博文中<Android源码学习之如何创建使用JNI>和<Android源码学习之如何使用eclipse+NDK>中,浅谈了如何创建使用JNI和如何利用NDK工具开发创建 ...
- koa 基础入门与源码学习
Koa 学习笔记 本期内容主要为 koa 基础与源码学习,后续会开一期 koa 项目实战.本文基础部分目录结构按照阮一峰老师的 koa 教程(有作修动).望本文能对您有所帮助!☀️ 前置基础 node ...
- Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...
- Shiro源码学习之一
一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
- vue实例没有挂载到html上,vue 源码学习 - 实例挂载
前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...
- 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制
Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...
- jQuery源码学习之Callbacks
jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...
- JDK源码学习笔记——Integer
一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...
最新文章
- 非常量引用的初始值必须是左值_C++核心编程--引用
- linux qtcreator输入中文,新版QT creator下解决fcitx无法输入中文问题(QTcreatorV4.1.0)...
- ER图和关系模型到MySQL数据库表
- Android1 按钮
- s3c6410 ddr初始化
- 特斯拉陶琳:全新Model 3标准续航升级版新增前排双层玻璃、电尾等功能
- python的模拟登录原理_python---cookie模拟登陆和模拟session原理
- Atitit. 单列索引与多列索引 多个条件的查询原理与设计实现
- VC6修改lib文件的输出路径
- geek卸载界的天花板
- yum安装wget命令
- [数字媒体] PR视频剪辑之竖屏实现横屏旋转切换和大视频文件缩小
- PS制作个人LOGO技术总结
- go 字符转ASCII 字符转成数字
- 青龙+WxPusher实现资产推送
- 如何将图片背景变为透明色
- 怎么用Photoshop做出物体的投影效果出来
- python练习实例——查找整数
- Exchange server 2010系列教程之五 浅谈Outlook 2010新功能
- android 反射机制
热门文章
- 谷歌大牛 Jeff Dean 是如何成为互联网战神的
- 解决手机端页面的鼠标点击出现蓝色背景
- 新世纪大学英语(第二版)综合教程第一册 Unit 1 (中英翻译和重点单词)
- 总结一个技术总监的教训和经验
- redmi路由器是linux,拯救小米路由器硬盘数据的方法及软件下载
- shopex服务器信息,ShopEx开放平台
- 电压力锅中的计算机控制系统,电压力锅的(电脑板)工作原理
- java有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
- 梅西大学研究员创造出新3D打印系统 用螺杆作为进料机构挤出颗粒
- 北京科技大学计算机考研考试科目,2020考研北京科技大学计算机考研考试科目...