Express高階 從乙個例子看路由分組機制

2021-09-11 12:35:04 字數 1665 閱讀 7783

路由是express的核心功能。本文通過乙個簡單例子,介紹express的路由分組機制,以及next('route')的正確使用方法。

使用過express的同學都知道,通過next()將**執行權轉移到下乙個中介軟體(例子略)。

在官網有下面例子,出現了next('route')的呼叫:

// a middleware sub-stack that handles get requests to the /user/:id path

router.get('/user/:id', function (req, res, next) , function (req, res, next) )

// handler for the /user/:id path, which renders a special page

router.get('/user/:id', function (req, res, next) )

複製**

差別就在於多了個引數,它跟普通的的next()有什麼區別呢?上面**實現的效果,用如下**實現不是更簡單嗎:

if (req.params.id == 0) else ;

})複製**

在sf上也有同學表達了同樣的疑惑《對express 應用級中介軟體next('route') 方法例項的疑惑》。

相信有同樣疑惑的同學不少,因為官網對next('route')用法的介紹有點簡略。下文將從express的路由分組機制來講回答這個問題。

express的路由內部實現比較複雜,這裡只挑跟題目有關的講。

express中,路由是以組的形式新增的。什麼意思呢,可以看下面偽**

複製**

在內部,express把上面新增的路由,分成了兩個組。繼續看偽**,可以看到,路由在內部被分成了兩個組。

var stack = [

{path: '/user/:id', fns: [fn1, fn2, fn3], // 路由組1

{path: '/user/:id', fns: [fn4, fn5, fn5] // 路由組2

];複製**

路由匹配就是個遍歷的過程,略。

答案:跳過當前路由分組中,剩餘的handler(中介軟體)

如果沒有next('route'),一路next()呼叫下去的話,呼叫順序是這樣的:

fn1 -> fn2 -> fn3 -> fn4 -> fn5 -> fn6

複製**

假設某些情況下,在執行了fn1後,想要跳過fn2fn3,怎麼辦?(比如樓主舉的例子)

答案就是在fn1裡呼叫next('route')

然後就變成了

fn1 -> fn4 -> fn5 -> fn6

複製**

express、koa2略有小研究,最近剛擼了一遍原始碼。另外,常年分享周邊科普文,歡迎關注 我的github 程式猿小卡,或者star 《nodejs學習筆記》

從乙個例子看Python3 x中序列解包

假如乙個字串 abcdefgh 要輸出下列格式 即 每次取出第乙個作為首,然後的字串拆成列表,放置在後面,最後成上面的輸出 一般的處理是 s abcdefgh while s front,s s 0 list s 1 print front,s a b c d e f g h b c d e f g...

從乙個例子說為什麼要用介面

如題,看看下面這個例子 現有狗 和企鵝兩個類 狗會玩飛碟,企鵝會游泳,為什麼要把玩飛碟和游泳的方法分別定義在兩個介面裡?如果 定義在介面反而顯得 更加累贅,因為還多了兩個介面。你可能會想,幹嘛不直接把玩飛碟的方法直接定義在狗類中,游泳 的方法直接定義在企鵝類中 這種情況下沒有父類 假設這樣一種情況 ...

從乙個例子講解拷貝建構函式與return

1 include iostream 2 using namespace std 34 5class location 613 location const location p 複製建構函式 1417 location 1821 int getx int gety 22private int x,...