Что делать, если NodeJS rest api находится в состоянии sendind 404 при использовании параметров? - PullRequest
0 голосов
/ 08 января 2020

У меня странная проблема при написании API. Я использую Nodejs и express. Проблема возникает, когда я пытаюсь использовать GET с параметрами.


Это мой код маршрута

    router.get('/addFriends/:email', (req, res, next) =>{
  const email = req.params.email;
  UserSchema.find({email: email}, { "friendsPending.emailSender": 1, _id : 0}, (err, data) =>{
    if(err){
      res.status(404).send(err);
    }else{
      res.status(200).send(data[0]);
    }
  });

});


Это мой звонок в Почтальоне: / users / addFriends? Email = a


При выполнении этого вызова сервер возвращает статус 404. Это происходило даже тогда, когда я тестировал его с помощью другого вызова get.
Любые комментарии оцениваются, однако другие вызовы POST и GET работают нормально (они используют тело, а не параметры). Спасибо

Ответы [ 3 ]

0 голосов
/ 08 января 2020

Это определение маршрута:

router.get('/addFriends/:email', ...);

ожидает URL-адрес, который выглядит следующим образом:

/addFriends/someEmail

И вы будете использовать req.params.email для ссылки на значение "someEmail" в путь URL.

Не то, что вы пытаетесь использовать:

/addFriends?email=a

Если вы хотите использовать URL, например (URL с параметром запроса):

/addFriends?email=a

Тогда у вас будет определение маршрута, подобное этому:

router.get('/addFriends', ...);

И тогда вы будете ссылаться на req.query.email в обработчике маршрута. Параметры запроса (вещи после ? в URL) берутся из объекта req.query.


В Express определения маршрута соответствуют пути URL, а не параметрам запроса.

0 голосов
/ 08 января 2020

когда вы используете /addFriends/:param, вы заставляете маршрутизатор соответствовать любому запросу, у которого есть часть в пути как :param. Например:

/users/addFriends/toFavorates // will **match**
/users/addFriends/toFavorates?email=a // will **match** 
/users/addFriends?email=a // will **not** match

, если вы хотите сделать :param в качестве необязательной части пути url, поставить ? после него

/addFriends/:param?

, он сообщит express маршруту, что :param является оптинальной частью. См. этот вопрос express использует path-to-regexp для сопоставления путей маршрута. прочитайте документацию для получения дополнительных опций

0 голосов
/ 08 января 2020

Вы смешали параметры запроса и параметры URL. Чтобы ваш пример работал, вам нужно использовать /addFriends/my-email@gmail.com вместо /users/addFriends?email=a.

Если вам нужно отправлять электронные письма через параметры запроса (все после ?), используйте req.query в вашем контроллере вместо req.params.email.

...