CastError:模型“产品”的路径“ _id”的值“ XXX”的Cast失败,转换为ObjectId

时间:2020-11-09 16:33:43

标签: node.js mongoose


 enter code here
const express=require('express');

const router= express.Router();

const asyncHandler = require('express-async-handler');


const Product=require('../models/productModel');

router.get('/', asyncHandler(async (req,res)=>{
    const products=await Product.find({})
    res.send(products)
}));

router.get('/:id',asyncHandler(async(req,res)=>{
    const product=await Product.findById(req.params.id)
    
    if(product){
        res.json(product)
    }else{
        res.status(404).json({message:"product not found"})
    }`enter code here`
}));


    enter code here

module.exports=router`enter code here`



在这里我在邮递员或浏览器中获取产品和具有ID的产品的数据,但是如果我输入了错误的ID,它将显示castError,而在控制台日志中则显示这是内部服务器500错误

1 个答案:

答案 0 :(得分:0)

如果其他人偶然理解原因,我将尝试更广泛地解释该错误。

_id进入Mongo是用特定的方式创建的。您可以检查docs的含义,其中_id是一个名为ObjectId的对象,并由以下项组成:

  • 一个4字节的时间戳记值,代表自Unix时代以来以秒为单位的ObjectId的创建
  • 5字节随机值
  • 3字节递增计数器,已初始化为随机值

这意味着不仅将接受任何值。

当您进行与_id匹配的查询时,mongo会期望一个ObjectId(或至少可以被解析为string的类型)。

因此,如果您尝试使用错误的_id(例如-1XXX),则会引发错误。 Mongo无法将-1解析为ObjectId

如果您正在测试应用程序,并且想使用伪造的_id,则需要生成一个有效的应用程序。

使用mongoose可以调用以下功能:mongoose.Types.ObjectId()

返回的值是一个新生成的_id,因此它具有有效的格式。