node.js - 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 路由没有调用任何东西。我在互联网上找不到任何理由为什么在代码中将路线移到更高的位置来解决问题。
解决方案
当您的路线 '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 参数的请求。
推荐阅读
- javascript - 在 Tabulator 中刷新组标题的最佳方法是什么
- amazon-ec2 - Terraform remote-exec 上传脚本失败:scp: /tmp 权限被拒绝
- json - Postgresql 按列数据动态聚合结果
- google-maps - Flutter web 反向地理编码
- groovy - 使用 Groovy 和 JUnit 5 断言时出现 MissingMethodException
- c# - C# 错误 - 未找到 PDF 标头签名
- python - 无法使用 Openpyxl 在 Pycharm 中打开文件
- antd - ANT 设计 4 表输入字段验证
- react-native - 设置 setState() 时,.map() 中出现问题。React-Native 中的新功能
- ios - Cocoapods - 安装 Mapbox-iOS-SDK 时出错