Форма &lt и & gt запрос мангуста

Я пытаюсь написать API узла, который принесет мне списки продуктов в соответствии с фильтрами, переданными в вызове API.

Например: http://localhost:8080/api/products?price= > 100 & price=>

Я написал ниже код, чтобы получить все продукты.

Product.find().populate("images", "image").exec(function(err, products){
    if(err){
        res.status(200);
        return res.json({
            success: false,
            message: err,
        });
    }else{
        res.status(200);
        return res.json({
            success: true,
            message: 'Products fetched successfully',
            data : products
        });
    }
 });

Как изменить приведенный выше код для работы с любыми фильтрами, переданными в вызове API? Я знаю, что если я поставлю {$and:[{price:{ $gt: 100, $lt: 200 }},{colour:red}]}для приведенного выше примера, который я дал, я получу желаемый результат.

как сформировать запрос динамически?

3 ответа

  1. Можно начать с переопределения параметров запроса, чтобы следовать этому шаблону:

    api/products?min=100&max=200&colour=red
    

    В вашем маршрутизаторе, req.queryуступит

    { min: "100", max: "200", colour: "red" }
    

    Используйте параметры в запросе как:

    app.get('/api/products', function(req, res) {
        var query = {
            "price": {
                "$gt": parseInt(req.query.min),
                "$lt": parseInt(req.query.max)
            },
            "colour": req.query.colour
        };
    
        Product.find(query).populate("images", "image").exec(callback);
    });
    

    Динамическое создание запроса зависит от ряда факторов. Во-первых, если запрос включает в себя только поиск документов, соответствующих определенному набору полей, и эти поля имеют строковый тип, то все, что вам нужно, это просто проверить
    чтобы увидеть, если req.объект запроса не пуст и использовать его в запросе find (), при условии, что параметры точно соответствуют полям в схеме. Для данного сценария следующий пример покажет интуицию:

    ПОЛУЧИТЬ

    api/products?name=foo&colour=red
    

    В маршрутизаторе req.запрос даст

    { name: "foo", colour: "red" }
    

    который затем можно использовать в качестве запроса e.g

    Product.find({ name: "foo", colour: "red" }).populate(...).exec(callback)
    

    Обращать в бегство

    app.get('/api/products', function(req, res) {
        var query = {};
        if (typeof req.query !== 'undefined' && req.query) query = req.query; 
    
        Product.find(query).populate("images", "image").exec(callback);
    });
    

    В случае, если у вас есть некоторые запросы диапазона, вам нужно будет предварительно обработать объект запроса, как в исходном ответе.

  2. вы должны обновить ссылку запроса, как:

     http://localhost:8080/api/products?minPrice=100&maxPrice=200&colour=red
    

    и после этого произведите запрос в стороне сервера как

    var query = {};
        query = {$and:[
      {price:{ $gte: parseInt(req.query.minPrice)}}, 
      {price: {$lte: parseInt(req.query.maxPrice)}},
      {colour:req.query.colour}]};
    
    Product.find(query).populate("images", "image").exec(function(err, products){ 
      //.....
    }
    

    Усовершенствованный:

    если вы передали запрос в url как выше, то вы можете генерировать запрос согласно переданным парам.

    var query = {};
    if(req.query.colour) {
      query.colour = req.query.colour
    }
    if(req.query.quantity) {
      query.quantity= req.query.quantity
    }
    //... as you need 
    // then
    Product.find(query).populate("images", "image").exec(function(err, products){ 
       //.....
    }
    
  3. Измените URL на

    http://localhost:8080/api/products?minPrice=100&maxPrice=200&colour=red
    

    и ваш запрос будет

     var query = {
            "price": {
                "$gt": parseInt(req.query.minPrice),
                "$lt": parseInt(req.query.maxPrice)
            },
            "colour": req.query.colour
        };
    
        Product.find(query, function(err, result) {
        })