express.js中路由器优先级的顺序

时间:2015-09-16 08:51:08

标签: node.js express

我想了解express.js中的顺序优先顺序。例如,如下面的代码

var routes = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');


app.use('/api', api);
app.use('/users', users);

app.use('/:name', function(req, res, next) {    
    console.log('from app.js name:', req.params.name);   

    res.render('index', {
        title: req.params.name
    });
}, routes);

app.use('/', function(req, res, next) {   
    res.render('index', {
        title: 'MainPage'
    });
});

如果请求来自客户端localhost:3000 / api / abc和localhost:3000 / user / abc,则来自api和用户模块的响应。但是如果我发出像localhost:3000 / myName / xyz这样的请求,app模块会返回一个响应。这种行为让我关注表达式的优先级和路由器模块的正确顺序。为什么路由器不会在动作“api”,“users”和参数“:name”之间混淆。请让我清楚地了解快递的作用和优先级。

2 个答案:

答案 0 :(得分:22)

订单先到先得。

在您的情况下,如果用户点击/ api,他将从api收到回复,但如果您在/api之前写/:name路由,则/api将用于/api请求。

  

案例1:/api将处理var routes = require('./routes/index'); var users = require('./routes/users'); var api = require('./routes/api'); app.use('/api', api); app.use('/users', users); app.use('/:name', function(req, res, next) { console.log('from app.js name:', req.params.name); res.render('index', { title: req.params.name }); }, routes); app.use('/', function(req, res, next) { res.render('index', { title: 'MainPage' }); }); 的请求。

/:name
  

案例2:/api投放/usersvar routes = require('./routes/index'); var users = require('./routes/users'); var api = require('./routes/api'); app.use('/:name', function(req, res, next) { console.log('from app.js name:', req.params.name); res.render('index', { title: req.params.name }); }, routes); app.use('/api', api); app.use('/users', users); app.use('/', function(req, res, next) { res.render('index', { title: 'MainPage' }); });

的请求
runtime

答案 1 :(得分:1)

ExpressJS documentation 中给出的示例非常简单,不幸的是很难找到。我只是通过 another SO question 找到的。

<块引用>

中间件函数是按顺序执行的,所以中间件包含的顺序很重要

app.use(function(req, res, next) {
    res.send('This is the only thing that ever happens')
}
app.use(...) // never used
app.get(...) // never used
app.put(...) // never used
app.post(...) // never used