Порядок промежуточного программного обеспечения на уровне маршрутизатора с использованием Express.js - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть следующие маршрутизаторы:

/* 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 */ вернет ноль, а если я поменяю местами, /* GET /users/username */ приведет к этой ошибке:

Ошибка приведения к ObjectId для значения «Гость» по пути «_id» для модели «Пользователь»

По существу, второе промежуточное ПО игнорируется.Тем не менее, оба необходимы для различного поведения.Я использую AngularJS $resource для взаимодействия с RESTful-источниками данных на стороне сервера.

  1. Почему я не могу использовать оба одновременно?Почему игнорируется второе промежуточное ПО?
  2. В каком порядке должны работать оба этих маршрутизатора?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Второе промежуточное программное обеспечение игнорируется, потому что шаблон URL такой же ... Как вы хотите, чтобы маршрутизатор делал различие между 'username' или '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);
  });
});
0 голосов
/ 28 декабря 2018

Для маршрутизации лучше выполнить: router.route ('your / route'). Get (aJsFile.function);

Затем вместо exec просто напишите атрибуты: ['id','username'] где: {username: username} Или что-то вроде этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...