在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.id
是undefined
,那么下一条路线就不会被执行,但是如果它存在了,它会吗?
基本上编码/命名约定让我有些困惑。为什么不next(false)
而不是next('route')
?
答案 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()没有任何参数说“开玩笑,我不是真的想要 处理这个“。它回过头来试图找到下一条路线 会匹配。