這是漸進式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請求方法。