【问题标题】:CastError: Cast to ObjectId failed for value "XXX" at path "_id" for model "Product"CastError:模型“Product”的路径“_id”处的值“XXX”转换为 ObjectId 失败
【发布时间】:2021-02-21 14:26:00
【问题描述】:

 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 错误

【问题讨论】:

  • 如果您输入错误的_id,您会收到一条错误消息,指出_id 是错误的...您的预期是什么?

标签: node.js mongoose


【解决方案1】:

我将尝试更广泛地解释该错误,以防其他人碰巧理解原因。

_id's into Mongo 是以特定方式创建的。您可以查看docs,其中解释了_id 是一个名为ObjectId 的对象,并由以下方式复合:

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

这意味着不会接受任何值。

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

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

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

使用mongoose可以调用使用这个函数:mongoose.Types.ObjectId()

返回值是一个新生成的_id,所以它的格式有效。

【讨论】:

  • 但是如果我输入了错误的 id 它应该显示 404 错误,因为它没有找到。但投射错误并出现 500 内部服务器错误。
  • 否,如果_id 无法解析,则会抛出错误,not 将执行 qery 并返回一个空文档。可以添加try/catch语句,保证查询失败时返回400
猜你喜欢
  • 2016-11-11
  • 2020-05-20
  • 2014-06-20
  • 2020-11-19
  • 2021-07-04
  • 2017-08-18
  • 2017-03-26
  • 2017-05-26
  • 2020-12-10
相关资源
最近更新 更多