【问题标题】:Order of router precedence in express.jsexpress.js 中的路由器优先顺序
【发布时间】:2015-12-12 18:11:20
【问题描述】:

我想了解 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 和 user 模块的响应。但是,如果我发出 localhost:3000/myName/xyz 之类的请求,应用程序模块会返回响应。这种行为让我关心 expressjs 的优先级是什么以及路由器模块的正确顺序是什么。为什么路由器不会混淆动作“api”、“users”和参数“:name”。请让我清楚地了解 express 是如何做的以及什么是优先级。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    顺序是先到先得。

    在你的情况下,如果用户点击 /api,他会从 api 得到响应,但是如果你在 /api 之前写 /:name 路由,/: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'
        });
    });
    

    案例 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'
        });
    });
    

    【讨论】:

    • 非常感谢@Laxmikant Dange,但如果我在 api 模块或用户模块中什么都不做,为什么 app.use("/", func(){}) 充当服务器......?它响应 MainPage..??
    • 在 ExpressJS 文档中,我可以找到有关 use() 和 get() 路由的优先规则的信息。
    • @hoan 因为没有:name 所以它不匹配/:name
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2016-10-05
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多