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

hoa*_*17b 17 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'
    });
});
Run Code Online (Sandbox Code Playgroud)

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

Lax*_*nge 25

订单先到先得.

在你的情况下,如果用户点击/ api,他将从api获得响应,但如果你/:name之前写过路由/api,/:name也会为/api请求服务.

案例1:/api将满足请求/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'
    });
});
Run Code Online (Sandbox Code Playgroud)

案例2:/:name提供/api和的请求/users

var 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'
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 在ExpressJS文档中,我可以找到有关use()和get()路由的优先级规则的信息. (7认同)
  • @hoan 因为没有 `:name` 所以它不匹配 `/:name` (2认同)

Sim*_*AsG 5

ExpressJS 文档中给出的示例非常简单,但不幸的是很难找到。我只是通过另一个SO问题才找到它的。

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

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
Run Code Online (Sandbox Code Playgroud)