首页 > 解决方案 > Mongoose:未调用 ID 时路径“_id”处的 CastError

问题描述

有问题的堆栈: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}。除了 res.render 中的 EJS 文件之外,/new 路由没有调用任何东西。我在互联网上找不到任何理由为什么在代码中将路线移到更高的位置来解决问题。

标签: node.jsmongodbmongoose

解决方案


当您的路线 '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 参数的请求。


推荐阅读