这是渐进式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个变化

  1. lib/route/layer.js

    1. 增加handle_error
  2. lib/route/route.js
    1. 修改.dispatch函数

      1. 如果有error,调用layer.handle_error
      2. 如果没有error,调用layer.handle_request
  3. lib/route/index.js
    1. 增加use函数
    2. 调整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-独孤求败相关推荐

  1. express 源码阅读(全)

    1. 简介 这篇文章主要的目的是分析理解express的源码,网络上关于源码的分析已经数不胜数,这篇文章准备另辟蹊径,仿制一个express的轮子,通过测试驱动的开发方式不断迭代,正向理解expres ...

  2. Android源码学习之浅析SystemServer脉络

    在之前的博文中<Android源码学习之如何创建使用JNI>和<Android源码学习之如何使用eclipse+NDK>中,浅谈了如何创建使用JNI和如何利用NDK工具开发创建 ...

  3. koa 基础入门与源码学习

    Koa 学习笔记 本期内容主要为 koa 基础与源码学习,后续会开一期 koa 项目实战.本文基础部分目录结构按照阮一峰老师的 koa 教程(有作修动).望本文能对您有所帮助!☀️ 前置基础 node ...

  4. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  5. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  6. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  7. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  8. 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制

    Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...

  9. jQuery源码学习之Callbacks

    jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...

  10. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

最新文章

  1. 非常量引用的初始值必须是左值_C++核心编程--引用
  2. linux qtcreator输入中文,新版QT creator下解决fcitx无法输入中文问题(QTcreatorV4.1.0)...
  3. ER图和关系模型到MySQL数据库表
  4. Android1 按钮
  5. s3c6410 ddr初始化
  6. 特斯拉陶琳:全新Model 3标准续航升级版新增前排双层玻璃、电尾等功能
  7. python的模拟登录原理_python---cookie模拟登陆和模拟session原理
  8. Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现
  9. VC6修改lib文件的输出路径
  10. geek卸载界的天花板
  11. yum安装wget命令
  12. [数字媒体] PR视频剪辑之竖屏实现横屏旋转切换和大视频文件缩小
  13. PS制作个人LOGO技术总结
  14. go 字符转ASCII 字符转成数字
  15. 青龙+WxPusher实现资产推送
  16. 如何将图片背景变为透明色
  17. 怎么用Photoshop做出物体的投影效果出来
  18. python练习实例——查找整数
  19. Exchange server 2010系列教程之五 浅谈Outlook 2010新功能
  20. android 反射机制

热门文章

  1. 谷歌大牛 Jeff Dean 是如何成为互联网战神的
  2. 解决手机端页面的鼠标点击出现蓝色背景
  3. 新世纪大学英语(第二版)综合教程第一册 Unit 1 (中英翻译和重点单词)
  4. 总结一个技术总监的教训和经验
  5. redmi路由器是linux,拯救小米路由器硬盘数据的方法及软件下载
  6. shopex服务器信息,ShopEx开放平台
  7. 电压力锅中的计算机控制系统,电压力锅的(电脑板)工作原理
  8. java有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
  9. 梅西大学研究员创造出新3D打印系统 用螺杆作为进料机构挤出颗粒
  10. 北京科技大学计算机考研考试科目,2020考研北京科技大学计算机考研考试科目...