Пн goose: CastError: сбой приведения к ObjectId для значения "" по пути "_id" для модели "" - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь сделать приложение с mongodb и nodejs. Я сделал специальный маршрут с параметром :id, и он работает хорошо.

И я сделал еще один маршрут получения, который имеет 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);
});

Когда я делаю запрос на получение маршрута выше, я получаю эту ошибку:

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 Ответ

0 голосов
/ 25 января 2020

product/:_id и product/:category являются «одинаковыми» в контексте маршрута ... Таким образом, даже если вы отправляете запрос product/:category, сервер вычисляет первую конечную точку, которая соответствует.

Решение 1 : Сделать каждый маршрут уникальным .

// _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);
});

...

Решение 2: Использование request.body

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

Примечание : Знайте, нет SQL инъекция.

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...