这是渐进式Express源码学习 | 小白也能懂源码系列文章的第二篇。javascript
请结合该节代码阅读Lesson2-道士下山java
这篇文章咱们在第一篇文章的基础上,实现一个稍微增强版的Express,功能包括node
具体的用法以下(咱们用my-express表示这个框架)git
const express = require('../index.js')
const app = express()
// 处理GET请求
app.get(function(req, res) {
res.end('You send GET request')
})
// 处理POST请求
app.post(function(req, res) {
res.end('You send POST request')
})
// 处理PUT请求
app.put(function(req, res) {
res.end('You send PUT request')
})
// 处理DELETE请求
app.delete(function(req, res) {
res.end('You send DELETE request')
})
app.listen(3000)
复制代码
先展现下目前的项目结构github
也就直说,咱们这篇文章要实现的express总共有两个源文件,一个是express,一个是router文件夹下的layer。shell
注意看下面的讲解时要对照代码,先上一下express.js的源码,而后一点点讲解express
首先看第33行到37行app
既然咱们对外提供get, post, put等方法,那咱们就要给proto赋值,这个实如今33行。methods使咱们引入的一个模块,他提供了http中经常使用的method,如GET, POST, PUT等,在33行到37行里,咱们对app.get, app.post, app.put等进行了赋值。即建立了一个layer,而后push到 handles中框架
再看6-12行curl
对比下上篇文章的代码
和上以前不一样的是,此次的入口函数中,咱们不是直接返回用户一个信息,而是调用自身的handle函数,那么handle函数也许就是关键。handle函数在25-31行
很容易理解,在这里,咱们把handles里面存储的layer所有拿出来,而后进行遍历调用。
到这里,咱们大概能够知道实现原理:当用户调用app.get的时候,咱们把处理函数保存到handles里面,而后请求来的时候,咱们就遍历调用这些函数。
Layer封装了这些处理函数,以下是Layer的源码
每一个Layer保存了一个method,handle。他的handle_method函数来判断这个请求的方法是否是和本身一致的,若是一致,就调用handel去处理,若是不一致,就直接返回
咱们首先经过命令node example/index.js运行样例 而后咱们经过下面命令来测试咱们的程序是否正常工做
curl -X GET http://localhost:3000
curl -X POST http://localhost:3000
curl -X PUT http://localhost:3000
curl -X DELETE http://localhost:3000
复制代码
结果如图
本文实现了一个增强的Express,他能让用户自定义处理方法还能分辨Http请求方法。