对express 应用级中间件next('route') 方法实例的疑惑

发布于 2022-09-06 13:11:33 字数 898 浏览 9 评论 0

express官网 的实例有点疑惑,不知道为什么这样书写.

官网的代码是这样的

// 一个中间件栈,处理指向 /user/:id 的 GET 请求
app.get('/user/:id', function (req, res, next) {
  // 如果 user id 为 0, 跳到下一个路由
  if (req.params.id == 0) next('route');
  // 否则将控制权交给栈中下一个中间件
  else next(); //
}, function (req, res, next) {
  // 渲染常规页面
  res.render('regular');
});

// 处理 /user/:id, 渲染一个特殊页面
app.get('/user/:id', function (req, res, next) {
  res.render('special');
});
以下是我个人想法,不知道和上面的代码有什么区别?
app.get('/user/:id', function (req, res, next) {
  if (req.params.id == 0) {
    res.render('special');
  } else {
    res.render('regular');
  };
})

附上网址 (http://www.expressjs.com.cn/g...
应用级中间件的第四个实例 next('route') 方法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤凫 2022-09-13 13:11:33

先回答楼主的问题

首先,官方这段代码实现的效果,跟楼主修改后代码的效果是差不多的。

其次,官网这段代码的主要目的,是告诉使用者,next('route')的用途。

最后,至于官网为什么要这样写,得从Express的路由机制谈起。

Express路由分组机制

Express的路由内部实现比较复杂,这里只挑跟题目有关的讲。

Express中,路由是以组的形式添加的。什么意思呢,可以看下面伪代码

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

在内部,Express把上面添加的路由,分成了两个组。继续看伪代码,可以看到,路由在内部被分成了两个组。

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

路由匹配就是个遍历的过程,略。

next('route')是干嘛的

答案:跳过当前路由分组中,剩余的handler(中间件)

如果没有next('route'),一路next()调用下去的话,调用顺序是这样的:

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

假设某些情况下,在执行了fn1后,想要跳过fn2fn3,怎么办?(比如楼主举的例子)

答案就是在fn1里调用next('route')

然后就变成了

fn1 -> fn4 -> fn5 -> fn6

完。

极度宠爱 2022-09-13 13:11:33

示例的重点在于展示中间件及next的用法,不是去实现某个具体的业务需求。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文