渐进式Express源码学习2-道士下山

这是渐进式Express源码学习 | 小白也能懂源码系列文章的第二篇。javascript

请结合该节代码阅读Lesson2-道士下山java

目标特性和目标用法

这篇文章咱们在第一篇文章的基础上,实现一个稍微增强版的Express,功能包括node

  • 自定义处理用户的请求
  • 区分请求方法,对不一样请求方法由不一样的函数处理,例如GET请求

具体的用法以下(咱们用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请求方法。

相关文章
相关标签/搜索