Проверьте, есть ли req.param.dogid / req.param.dogname в Express Mongoose

У меня есть 2 функции GET в одном файле.

один для dogid, а другой для dogname.

//Operations for api/dogs/{dogId} route
//get operation
 router.get('/:dogId', async (req,res)=>{   
      try{
          const dog = await Dogs.findById(req.params.dogId);
          res.json(dog);
      }catch(error){
          res.json({message:error});
      }
  
  })

И

//Operations for api/dogs/{dogName} route
 //get operation
 router.get('/:dogName', async (req,res)=>{   
      try{
          const dog = await Dogs.find({'name': { $in: req.params.dogName}})
          res.json(dog);
      }catch(error){
          res.json({message:error});
      }
  
  })

Когда я пытаюсь запустить npm, это не вызывает никаких проблем.

Но в Postman, когда я отправляю операцию GET для http://localhost:3000/api/dogs/Sasha

то показывает следующее:

{
    "message": {
        "stringValue": "\"Sasha\"",
        "valueType": "string",
        "kind": "ObjectId",
        "value": "Sasha",
        "path": "_id",
        "reason": {},
        "name": "CastError",
        "message": "Cast to ObjectId failed for value \"Sasha\" (type string) at path \"_id\" for model \"Doggies\""
    }
}

Код для получения данных с собачьим именем уже присутствует. Но поскольку функция get для маршрута dogid записывается перед маршрутом dogname, она показывает эту ошибку.

Думаю, нам нужно добавить условие в маршрут api/dogs/{dogId}, которое будет проверять, действительно ли параметр /:dogId является ObjectId или нет. Но я не могу понять, как.

Jency 23.04.2022 14:53
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
1
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что GET api/dogs/:dogId обрабатывает запрос, так как он написан до GET api/dogs/:dogname.

Чтобы решить эту проблему, попробуйте изменить дизайн вашего API или использовать другие методы HTTP-запроса. Например :

POST api/dogs/:dogId
GET api/dogs/:dogName

or GET api/animals/dogs/:dogId
   GET api/dogs/:dogName

Но не делайте этого:

   GET api/dogs/:dogId
   GET api/dogs/:dogName

Я полагаю, что использование слова в верблюжьей оболочке не решает проблему. Все равно проверит и скоро расскажет

Jency 23.04.2022 14:35

Это не работает. Бьюсь об заклад, что-то нужно сделать, проверив req.params.dogId. я просто не могу понять что

Jency 23.04.2022 14:39

Если все еще выдает ту же ошибку о сбое приведения к идентификатору объекта, то вы делаете запрос на получение на localhost: 3000/api/dogs/(недопустимый идентификатор mongodb)

Mohammad Ismail 23.04.2022 14:53

Да, я пытаюсь ПРИОБРЕСТИ собаку по имени. Также у меня есть еще одна операция получения для ObjectId

Jency 23.04.2022 15:07

Как уже указывал @Mohammad Ismail, вам нужно использовать другой метод HTTP, чтобы различать 2 маршрута.

Есть еще один подход — использовать query вместо param
. Вы отправляете запрос как localhost:3000/api/dog?dogName=abc
Затем в вашем коде: req.query.dogName даст вам значение abc

Да, мы обсуждали этот вопрос. Так как у нас не может быть одного и того же маршрута для двоих, 1-й с dogId останется как есть. И мы будем использовать dogeName в качестве запроса. Меня не познакомили с запросом. За это я застрял. После нескольких поисков теперь я понял. Спасибо.

Jency 23.04.2022 19:32

Приятно слышать, что вы можете заставить его работать, удачного кодирования!

Jimmy 23.04.2022 20:01

Другие вопросы по теме