多条路径匹配时,Express如何知道使用哪个Router路径?
How does Express know which Router path to use when multiple paths match?
假设有2个router.route(),例如:
router.route('/app/:id').get(funtion(req, res, next){
console.log("id route")
});
和
router.route('/app/:username').get(funtion(req, res, next){
console.log("user route")
});
当调用 GET /app/nsuzuki
时,它使用了哪个 router.route() 以及为什么?
要完全理解这一点,请阅读文档:http://expressjs.com/api.html#router.METHOD
Express 路由如何捕获路径
当您使用 :param
作为路径的一部分时,它会匹配 /*
之类的所有内容,并且捕获的值存储在 req.params.param
.
中
当您有多个规则时,第一个注册的是第一个检查的规则。它根据每个规则检查每个调用,直到找到匹配项。如果您调用 next()
时未向其传递任何值,它将查找下一个匹配项(在同一路由中,或继续进入下一个中间件)。
所以这三个规则都是运行
var handleRoute = function(req, res, next){
console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
next();
}
route.route('/user/:id').get(handleRoute);
route.route('/user/:user').get(handleRoute);
route.route('/user/*').get(handleRoute);
当我请求 /user/foobar
时,我会看到以下输出(作为客户端可能是一个错误,因为我从未响应过 :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
这三个都会命中,但每个的上下文不同。
如何使用正则表达式捕获路径模式
如果您想为 ID(假设所有数字)和用户名(所有字母)捕获单独的路由,您可以这样做:
var handleRoute = function(tag) {
return function(req, res, next) {
console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
res.status(200)
.json({
success: 'yay!'
});
};
};
route.route(/^\/user\/([0-9]+)$/i)
.get(handleRoute('id'));
route.route(/^\user\/([A-Za-z]+)$/i)
.get(handleRoute('user'));
route.route('/user/*')
.get(handleRoute('catch all'));
注意我的捕获组周围的假说。没有这个,params
是空的。它会自动捕获字符串中的 *
因为他们是好人。当我 运行 针对三种不同的类型时,我将得到以下输出。
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
综上所述,您正在向一些感染系统的漏洞敞开大门。可能需要考虑您的 URL 模式。
假设有2个router.route(),例如:
router.route('/app/:id').get(funtion(req, res, next){
console.log("id route")
});
和
router.route('/app/:username').get(funtion(req, res, next){
console.log("user route")
});
当调用 GET /app/nsuzuki
时,它使用了哪个 router.route() 以及为什么?
要完全理解这一点,请阅读文档:http://expressjs.com/api.html#router.METHOD
Express 路由如何捕获路径
当您使用 :param
作为路径的一部分时,它会匹配 /*
之类的所有内容,并且捕获的值存储在 req.params.param
.
当您有多个规则时,第一个注册的是第一个检查的规则。它根据每个规则检查每个调用,直到找到匹配项。如果您调用 next()
时未向其传递任何值,它将查找下一个匹配项(在同一路由中,或继续进入下一个中间件)。
所以这三个规则都是运行
var handleRoute = function(req, res, next){
console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
next();
}
route.route('/user/:id').get(handleRoute);
route.route('/user/:user').get(handleRoute);
route.route('/user/*').get(handleRoute);
当我请求 /user/foobar
时,我会看到以下输出(作为客户端可能是一个错误,因为我从未响应过 :P)
/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
这三个都会命中,但每个的上下文不同。
如何使用正则表达式捕获路径模式
如果您想为 ID(假设所有数字)和用户名(所有字母)捕获单独的路由,您可以这样做:
var handleRoute = function(tag) {
return function(req, res, next) {
console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
res.status(200)
.json({
success: 'yay!'
});
};
};
route.route(/^\/user\/([0-9]+)$/i)
.get(handleRoute('id'));
route.route(/^\user\/([A-Za-z]+)$/i)
.get(handleRoute('user'));
route.route('/user/*')
.get(handleRoute('catch all'));
注意我的捕获组周围的假说。没有这个,params
是空的。它会自动捕获字符串中的 *
因为他们是好人。当我 运行 针对三种不同的类型时,我将得到以下输出。
id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
综上所述,您正在向一些感染系统的漏洞敞开大门。可能需要考虑您的 URL 模式。