当前位置: 首页 > 知识库问答 >
问题:

Mongoose:CastError:model的路径“\u id”处的值“”的转换为ObjectId失败

汤飞翮
2023-03-14

我正在尝试用mongodb和nodejs制作一个应用程序。我做了一个特殊的路由,它有:id参数,并且运行良好。

我还做了另一个get路线,它有product/:category。每次我收到该错误时向该路由发送请求时:

CastError: Cast to ObjectId failed for value "(here is my req.params.category)" at path "_id" for model "Product"

我的路线是:

// product is my model I called it in top of the file
app.get('product/:category', async (req, res)=>{
    const productByCategory = await product.find({category: req.params.category});
    res.json(productByCategory);
});

当我向上面的路由发出get请求时,我得到了该错误:

CastError: Cast to ObjectId failed for value "(here is my req.params.category)" at path "_id" for model "Product"

我的产品模型是:

const ProductSchema = new mongoose.Schema({
    title:{
        type: String,
        required: true
    },
    description:{
        type: String,
        min: 40,
        required: true
    },
    category:{
        type: String,
        required: true
    },
    price:{
        type: Number,
        required: true
    },
    imageUrl:{
        type: String,
        required: true
    },
    quantity:{
        type: Number,
        required: true
    },
    comments: [{
        type: Object
    }],
    seller: {
        sellerId:{
            type: String,
            required: true
        },
        username:{
            type: String,
            required: true
        },
        shopName:{
            type: String,
            required: true
        },
        category:{
            type: String,
            required: true
        }
    },
    location: {
        type: "String",
        required: true
    },
    date:{
        type: Date,
        default: Date.now
    }
});

我怎样才能解决这个问题?

共有1个答案

颛孙智勇
2023-03-14

product/:_idproduct/:category在路由上下文中是“相同的”。。。所以,即使您发送product/:category请求,服务器也会计算匹配的第一个endpoint。

解决方案一:让每条路线都独一无二。

// _id
app.get('product/_id/:_id', async (req, res)=>{
    const productById = await product.find({_id: req.params._id});
    res.json(productById);
});

// category
app.get('product/category/:category', async (req, res)=>{
    const productByCategory = await product.find({category: req.params.category});
    res.json(productByCategory);
});

...

解决方案二:使用request.body

app.post('product', async (req, res)=>{
    const product = await product.find(req.body});
    res.json(product);
});

注意:注意非关系型数据库注入。

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL注射

 类似资料:
  • 我正在开发一个节点应用程序。在我添加之前,所有的路线似乎都在运行 当我注释掉id路由时,新路由按预期工作。但是当它在那里的时候,我试着在: 我得到以下错误: (节点:17216)未经处理的PromisejectionWarning:CastError:在模型“Client”的路径“\u id”处对值“new”进行转换到ObjectId失败 这是我的模式: 我似乎找不到这里的问题,任何帮助都将不胜感

  • 我的应用程序可以在本地工作,但在生产中,我似乎无法使用猫鼬从mongo获取特定的东西。我尝试过:

  • 我正在用node/express/mongo/mongoose构建一个应用程序。我遇到了一个我似乎无法理解的错误,谷歌搜索到目前为止没有任何帮助。 我创建了一个简单的、以猫为主题的示例来重现我遇到的错误。我基本上是通过ObjectId检索一个对象。我正在使用创建对象时自动生成的对象id(作为字符串)。 当我导航到路径localhost:3000/kitty/586d62878fc14d30e0ac

  • 好吧,我看到这里有一些这样的帖子,但他们没有帮助我。。。 让我描述一下我的问题: 我有两个模式 现在我已经有了一个B对象,我想创建一个a对象。 所以我这样做: b对象是从我的monogDB加载的。调试器为我的b显示了一个有效的ObjectId(53627ed535d9d04416e26218或Sb~Õ5ÙÐDáb)。 但是,当我保存新的A-Object时,会出现错误:“CastError:Cast

  • 我的控制器obter_todos_precos只是一个console.log,没有使用任何模型,但我得到以下错误: 为什么我会有这种行为?

  • 嘿,伙计们真的需要一些关于删除路由的帮助。我正在使用RESTful路由,尝试遵循约定,添加删除路由时,我得到错误: CastError:模型"Blog"的路径"_id"处的值"X"转换为ObjectId失败 我已经在stackoverflow上搜索了这个问题,我能想到的最好的版本是猫鼬有一个错误。我把它回滚到V4.10.0,仍然在处理这个问题。我的代码如下: