res status 500. Сообщение: Внутренняя ошибка сервера. Поиск продукта по названию и цене. - PullRequest
2 голосов
/ 26 октября 2019

Я пытаюсь найти товары по названию и цене. Это не выполняет ошибку во время выполнения. Но у меня есть ошибка на почтальоне.

Я только хочу найти имя или цену из продукта.

Я помещаю имя в одном методе, а цену в другом в виде параметров

это моя модель продукта:

    const mongoose = require('mongoose');
    const { Schema } = mongoose;

    const productSchema = new Schema({
   name: String,
   description: String,
   brand: String,
   price: Number,
   availableStock: Number,
   code: Number,
   isPassed: Boolean,
   createdAt: Date,
   passedAt: Date
    });

 mongoose.model('products', productSchema);

И это мои маршруты продуктов

найти продукт по названию

     app.get('/api/products/:name', async(req,res) =>{

        try{
      const name = req.params.name;

      const product = await Product.findOne({product : name});

      if(product){
        res.send(product);
      }
      else{
        res.status(404).send({ message: `product's name: '${name}' couldn't be 
    found ` });
      }

    }catch (err) {
      console.log(err);
        res.status(500).send({ message: `Internal Server Error.\n\n${err}` });
    }

      });

найти продукт по цене

    app.get('/api/products/:price', async(req,res) =>{

    try{
      const price = req.params.price;

      const products = await Product.find({products : price});

      if(products){
        res.send(products);
      }
      else{
        res.status(404).send({message:`Products with price: '${price}' 
    couldn't be found`})
      }

       }catch (err) {
        console.log(err);
        res.status(500).send({ message: `Internal server error.\n\n${err}` });
      }

      });

Я ожидаю, что продукт будет найден по имени или цене, но в случае с именем это будет результат:

{"message": "Внутренняя ошибка сервера. \ N \ nCastError: Ошибка приведения к ObjectIdдля значения \ "P1 \" по пути \ "_ id \" для модели \ "products \" "} И, наконец, в случае цены это результат:

{" message ":" ВнутреннийОшибка сервера. \ N \ nCastError: Ошибка приведения к ObjectId для значения \ "500 \" по пути \ "_ id \" для модели \ "products \" "}

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Можете ли вы попробовать изменить

const product = await Product.findOne({product : name});
const product = await Product.findOne({product : price});

на

const product = await Product.findOne({name : name});
const product = await Product.findOne({price : price});

Я имею в виду, используя имя схемы для каждого параметра.

1 голос
/ 26 октября 2019

Похоже, у вас есть маршрут /api/products/:id, чтобы найти продукт по идентификатору, поставленному перед вашим поиском по названию и маршруту цены, поэтому, когда вы получаете, например, "/ api / products / 500", он идет по маршруту idи принять «500» как req.params.id.

. Также, определить 2 маршрута как /api/products/:name и /api/products/:price не очень хорошая идея, потому что он не будет знать, когда идти к названию или ценовому маршруту, но всегда идетк маршруту, который был определен первым.

Я предлагаю использовать один маршрут, например /api/products/search, и использовать req.query для поиска вместо req.params (например: / api / products / search? name = test & price =500 ").

Примечание : необходимо определить этот маршрут перед идентификатором маршрута.

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