在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 對(duì)express 應(yīng)用級(jí)中間件next('route') 方法實(shí)例的疑惑

對(duì)express 應(yīng)用級(jí)中間件next('route') 方法實(shí)例的疑惑

對(duì)express官網(wǎng) 的實(shí)例有點(diǎn)疑惑,不知道為什么這樣書(shū)寫(xiě).

官網(wǎng)的代碼是這樣的

// 一個(gè)中間件棧,處理指向 /user/:id 的 GET 請(qǐng)求
app.get('/user/:id', function (req, res, next) {
  // 如果 user id 為 0, 跳到下一個(gè)路由
  if (req.params.id == 0) next('route');
  // 否則將控制權(quán)交給棧中下一個(gè)中間件
  else next(); //
}, function (req, res, next) {
  // 渲染常規(guī)頁(yè)面
  res.render('regular');
});

// 處理 /user/:id, 渲染一個(gè)特殊頁(yè)面
app.get('/user/:id', function (req, res, next) {
  res.render('special');
});
以下是我個(gè)人想法,不知道和上面的代碼有什么區(qū)別?
app.get('/user/:id', function (req, res, next) {
  if (req.params.id == 0) {
    res.render('special');
  } else {
    res.render('regular');
  };
})

附上網(wǎng)址 (http://www.expressjs.com.cn/g...
應(yīng)用級(jí)中間件的第四個(gè)實(shí)例 next('route') 方法

回答
編輯回答
礙你眼

先回答樓主的問(wèn)題

首先,官方這段代碼實(shí)現(xiàn)的效果,跟樓主修改后代碼的效果是差不多的。

其次,官網(wǎng)這段代碼的主要目的,是告訴使用者,next('route')的用途。

最后,至于官網(wǎng)為什么要這樣寫(xiě),得從Express的路由機(jī)制談起。

Express路由分組機(jī)制

Express的路由內(nèi)部實(shí)現(xiàn)比較復(fù)雜,這里只挑跟題目有關(guān)的講。

Express中,路由是以組的形式添加的。什么意思呢,可以看下面?zhèn)未a

app.get('/user/:id', fn1, fn2, fn3);
app.get('/user/:id', fn4, fn5, fn6);

在內(nèi)部,Express把上面添加的路由,分成了兩個(gè)組。繼續(xù)看偽代碼,可以看到,路由在內(nèi)部被分成了兩個(gè)組。

var stack = [
  {path: '/user/:id', fns: [fn1, fn2, fn3], // 路由組1
  {path: '/user/:id', fns: [fn4, fn5, fn5] // 路由組2
];

路由匹配就是個(gè)遍歷的過(guò)程,略。

next('route')是干嘛的

答案:跳過(guò)當(dāng)前路由分組中,剩余的handler(中間件)

如果沒(méi)有next('route'),一路next()調(diào)用下去的話,調(diào)用順序是這樣的:

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

假設(shè)某些情況下,在執(zhí)行了fn1后,想要跳過(guò)fn2、fn3,怎么辦?(比如樓主舉的例子)

答案就是在fn1里調(diào)用next('route')

然后就變成了

fn1 -> fn4 -> fn5 -> fn6

完。

2017年8月6日 01:46
編輯回答
毀與悔

示例的重點(diǎn)在于展示中間件及next的用法,不是去實(shí)現(xiàn)某個(gè)具體的業(yè)務(wù)需求。

2018年4月14日 19:51