У меня есть 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, она показывает эту ошибку.
Проблема в том, что 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
Я полагаю, что использование слова в верблюжьей оболочке не решает проблему. Все равно проверит и скоро расскажет
Это не работает. Бьюсь об заклад, что-то нужно сделать, проверив req.params.dogId. я просто не могу понять что
Если все еще выдает ту же ошибку о сбое приведения к идентификатору объекта, то вы делаете запрос на получение на localhost: 3000/api/dogs/(недопустимый идентификатор mongodb)
Да, я пытаюсь ПРИОБРЕСТИ собаку по имени. Также у меня есть еще одна операция получения для ObjectId
Как уже указывал @Mohammad Ismail, вам нужно использовать другой метод HTTP, чтобы различать 2 маршрута.
Есть еще один подход — использовать query
вместо param
.
Вы отправляете запрос как localhost:3000/api/dog?dogName=abc
Затем в вашем коде: req.query.dogName
даст вам значение abc
Да, мы обсуждали этот вопрос. Так как у нас не может быть одного и того же маршрута для двоих, 1-й с dogId останется как есть. И мы будем использовать dogeName в качестве запроса. Меня не познакомили с запросом. За это я застрял. После нескольких поисков теперь я понял. Спасибо.
Приятно слышать, что вы можете заставить его работать, удачного кодирования!
Думаю, нам нужно добавить условие в маршрут api/dogs/{dogId}, которое будет проверять, действительно ли параметр /:dogId является ObjectId или нет. Но я не могу понять, как.