当多个路径匹配时,Express如何知道要使用哪个路由器路径?

Nat*_*uki 0 mongodb node.js express angularjs mean-stack

假设有2个router.route(),例如:

router.route('/app/:id').get(funtion(req, res, next){
    console.log("id route")
});
Run Code Online (Sandbox Code Playgroud)

router.route('/app/:username').get(funtion(req, res, next){
    console.log("user route")
});
Run Code Online (Sandbox Code Playgroud)

什么时候GET /app/nsuzuki被调用,它使用哪个router.route(),为什么?

Chr*_*SFT 5

要完全理解这一点,请阅读文档:http : //expressjs.com/api.html#router.METHOD

快速路线如何捕获路径

当您将a :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);
Run Code Online (Sandbox Code Playgroud)

当我请求时/user/foobar,我将看到以下输出(可能是一个错误,因为我从未响应:P)

/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar
Run Code Online (Sandbox Code Playgroud)

它将同时影响所有三个,但是每个上下文都不同。

如何使用正则表达式捕获路径模式

如果要捕获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'));
Run Code Online (Sandbox Code Playgroud)

请注意我的捕获组周围的特质。没有这个,params就是空的。它会自动*在字符串中捕获,因为他们是好人。当我针对三种不同类型运行时,将获得以下输出信息。

id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1
Run Code Online (Sandbox Code Playgroud)

所有这些都说明了,您正在向某些错误的向量敞开大门,以使您的系统受到感染。可能要考虑您的网址格式。