angularjs - 当多个路径匹配时,Express 如何知道使用哪个 Router 路径?

标签 angularjs node.js mongodb express mean-stack

假设有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 Routes 如何捕获路径

当您使用 :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 模式。

关于angularjs - 当多个路径匹配时,Express 如何知道使用哪个 Router 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632763/

相关文章:

javascript - 如何更改注销按钮以 Angular 登录

javascript - 如何从angularjs http回调中查看json数据?

node.js - mongodb nodejs db.collection 不是函数

node.js - 错误 : socket hang up code: 'ECONNRESET' on Google cloud storage

regex - 与 mongodb 聚合中的子字符串匹配

javascript - Express - 无法连接到 MongoDB 服务器

javascript - JSFiddle 不运行我的 AngularJS 代码

javascript - 在可编辑行内设置变量

node.js - 使用另一个 Node 版本重新编译 Node 依赖项

mongodb - hasgoy/belongsTo导致MongoDB Grails GORM发生意外行为