使用Express.js的路由器级中间件订单

时间:2018-12-28 15:12:26

标签: rest express router middleware

我有以下路由器:

/* GET /users/username */
router.get("/:username", function(req, res, next) {
  User.findOne({
    username: req.params.username
  }).exec(function(err, user) {
    if (err) return next(error);
    res.json(user);
  });
});

/* GET /users/id */
router.get("/:id", function(req, res, next) {
  User.findById(req.params.id, function(err, user) {
    if (err) return next(err);
    res.json(user);
  });
});

按照上述顺序,/* GET /users/id */将返回null,如果我交换顺序,则/* GET /users/username */将导致此错误:

  

在模型“用户”的路径“ _id”处,对值“来宾”的对象ID广播失败

基本上,第二个中间件被忽略。但是,这两种行为都是必需的。我正在使用AngularJS $resource与RESTful服务器端数据源进行交互。

  1. 为什么不能同时使用两者?为什么忽略第二个中间件?
  2. 这两个路由器应按什么顺序工作?

2 个答案:

答案 0 :(得分:0)

最好通过以下方式进行路由: router.route('您的/ route')。get(aJsFile.function);

然后,而不是执行,只写 属性:['id','用户名'] 其中:{username:username} 或类似的东西。

答案 1 :(得分:0)

第二个中间件将被忽略,因为url模式相同...您希望路由器如何区分“用户名”或“ id”;

您必须首先检查每个示例是否为id。

router.get("/:username", function(req, res, next) {
  const username = req.params.username;
  if (!isNaN(parseInt(username)) {     // <------ Check if it's an ID
     next();
  } else {
  User.findOne({
    username: req.params.username
  }).exec(function(err, user) {
    if (err) return next(error);
    res.json(user);
  });
   }
});

/* GET /users/id */
router.get("/:id", function(req, res, next) {
  User.findById(req.params.id, function(err, user) {
    if (err) return next(err);
    res.json(user);
  });
});