express.js 中的路由器优先级顺序 [英] Order of router precedence in express.js

查看:39
本文介绍了express.js 中的路由器优先级顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

var routes = require('./routes/index');var users = require('./routes/users');var api = require('./routes/api');app.use('/api', api);app.use('/users', 用户);app.use('/:name', function(req, res, next) {console.log('from app.js name:', req.params.name);res.render('索引', {标题:req.params.name});}, 路线);app.use('/', function(req, res, next) {res.render('索引', {标题:'主页'});});

如果请求来自客户端 localhost:3000/api/abc 和 localhost:3000/user/abc,则响应来自 api 和用户模块.但是,如果我发出类似 localhost:3000/myName/xyz 的请求,应用程序模块会返回响应.这种行为让我担心 expressjs 的优先级是什么以及路由器模块的正确顺序是什么.为什么路由器不会混淆操作api"、users"和参数:name".请让我清楚地了解 express 是如何工作的,什么是优先级.

解决方案

先到先得.

在你的情况下,如果用户点击/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', 用户);app.use('/:name', function(req, res, next) {console.log('from app.js name:', req.params.name);res.render('索引', {标题:req.params.name});}, 路线);app.use('/', function(req, res, next) {res.render('索引', {标题:'主页'});});

<块引用>

Case2:/: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('索引', {标题:req.params.name});}, 路线);app.use('/api', api);app.use('/users', 用户);app.use('/', function(req, res, next) {res.render('索引', {标题:'主页'});});

I would like to understand the order precedence in express.js. For example, as bellow code

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

If a request come from client localhost:3000/api/abc and localhost:3000/user/abc, the response from api and user module. But if I make a request like localhost:3000/myName/xyz, the app module return a response. This behavior let me concern about what is precedence of expressjs and what is correct order for router modules. Why routers do not confuse between actions "api", "users" and parameter ":name". Please let me understand clearly how express does and what is precedence.

解决方案

The order is first come first serve.

In your case, if user hits /api, he will get response from api, but if you write /:name route before /api, /:name will serve for /api requests also.

Case1: /api will serve requests for /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'
    });
});

Case2: /:name serves requests for /api and /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'
    });
});

这篇关于express.js 中的路由器优先级顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆