路线('next')在ExpressJS中做了什么?

时间:2015-05-30 01:39:14

标签: javascript node.js express

documentation中说:

  

您可以提供多个类似中间件的回调函数,但这些回调可以调用next('route')来绕过剩余的路由回调。您可以使用此机制对路径施加前置条件,然后在没有理由继续当前路由的情况下将控制权传递给后续路由。

这是否意味着如果我写这样的路线:

app.get('/', function(req, res, next) {
    if (!req.params.id) {
        res.statusCode(400).send({error: "id parameter is required"});
        next('route');
    } else {
        next();
    }
}, function(req, res) {
    res.send({something: 'something'})
});

params.idundefined,那么下一条路线就不会被执行,但是如果它存在了,它会吗?

基本上编码/命名约定让我有些困惑。为什么不next(false)而不是next('route')

2 个答案:

答案 0 :(得分:3)

我找到了答案。使用app或Express路由器时,您可以为同一路径定义多个路由:

// first set of routes for GET /user/:id
app.get('/user/:id', function (req, res, next) {
  // logic
}, function (req, res, next) {
  // logic
});

// second set of routes for GET /user/:id
app.get('/user/:id', function (req, res, next) {
  // logic
});

如果来自第一条路线的任何回调(中间件),您拨打next('route')将跳过该路线的所有回调并将控制权传递给下一组路线:

// first set of routes for GET /user/:id
app.get('/user/:id', function (req, res, next) {
  next('route')
}, function (req, res, next) {
  // this middleware won't be executed at all
});

// second set of routes for GET /user/:id
app.get('/user/:id', function (req, res, next) {
  // the next('route') in the first callback of the first set of routes transfer control to here
});

现在使用next('route')而不是next(false)更有意义:它将控制权转移到为当前路径定义的下一条路线。

答案 1 :(得分:0)

  

(if)params.id未定义,则下一条路线不会   执行,但如果它存在,它会吗?

关键的想法是文件中的下一个路线将选中

来自duplicate question,它可以更详细地回答这个问题:

  

next()没有任何参数说“开玩笑,我不是真的想要   处理这个“。它回过头来试图找到下一条路线   会匹配。