Warm tip: This article is reproduced from serverfault.com, please click

node.js- Mongoose :当未调用ID时,路径“ _id”处的CastError

(node.js - Mongoose: CastError at path "_id" when ID is not being called)

发布于 2020-11-28 03:57:01

有问题的堆栈:Node,EJS,Mongo,Mongoose

我的路由设置如下:

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路由移到/:id路由上方来解决了该错误。

我的问题是:为什么能解决这个问题?我没有在/ new路由中致电{id}。/ new路由除了在res.render中的我的EJS文件外没有调用任何其他内容。我在互联网上找不到任何理由来解释为什么在代码中将路线移高些可以解决此问题。

Questioner
Jake Starkey
Viewed
11
Naveen Chahar 2020-11-28 15:30:54

当在上面定义路由'app.get('/ products /:id')'时,它将'/ products /'之后的每个值都视为一个id参数。例如,如果你调用“ / products / new”路由,则app.get('/ products /:id')路由会以id参数为“ new”的形式捕获请求,并开始处理该请求而不允许它到达预期的位置。

但是,如果你在'app.get('/ products /:id')'之前定义'app.get('/ products / new')'路由,它将捕获任何针对'/ products / new'路由的请求,并且保留包含id参数的请求。