Mongoose: ошибка заклинания в пути «_id», когда идентификатор не вызывается

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Рассматриваемый стек: узел, EJS, Монго, Мангуст

Моя маршрутизация была настроена так:

 app.get('/products', async (req,res) => {
    const products= await Product.find({});
    res.render('products/index', {products});
})

app.get('/products/:id', async (req,res) =>{
    const {id} = req.params;
    const product = await Product.findById(id);
    res.render('products/show', {product});
})

app.get('/products/new', (req,res)=>{
    res.render('products/new');
})
 

И я получал эту ошибку:

 CastError: Cast to ObjectId failed for value "new" at path "_id" for model "Product"
 

И в конце концов я исправил ошибку, переместив /new route над маршрутом /:id .

Мой вопрос: почему это исправило? Я не вызывал {id} в /новом маршруте. Маршрут /new не вызывал ничего, кроме моего файла EJS в res.render. Я не могу найти в Интернете какую-либо причину, по которой перемещение маршрута выше в коде устранило проблему.

Ответ №1:

Когда ваш маршрут ‘app.get(‘/ products/: id’)’ определен выше, он рассматривает каждое значение после ‘/ products/’ как параметр id. Например, если вы вызываете маршрут ‘/ products / new’, маршрут app.get (‘/ products/: id’) перехватит запрос, думая, что значение параметра id равно ‘new’, и начнет обработку запроса, не позволяя ему достичь намеченного места.

Но если вы определите маршрут «app.get (‘/ products / new’)» перед маршрутом «app.get (‘/ products/: id’)», он перехватит любой запрос, предназначенный для маршрута «/ products / new», и оставит запросы, содержащие параметры идентификатора.

Комментарии:

1. И теперь все это имеет смысл. Спасибо!

2. Рад помочь!!