Необязательная цепочка таких методов, как sort, limit, skip - PullRequest
1 голос
/ 03 июля 2019

Я передаю параметры запроса, и может быть любая комбинация sort, limit или skip для запроса Mongoose.

Я подумал о том, чтобы создать несколько запросов Mongoose на основе того, какие параметры были переданы. Таким образом, если будет передано только sort, тогда результирующий запрос будет иметь Document.find({}).sort({}), а в случае передачи только limit запрос будет Document.find({}).limit({})

Должен ли я написать что-то вроде этого -

router.get('/', (req, res) => {
    if(req.query.sortByPrice) {
        Property.find({})
        .sort({ price: req.query.sortByPrice === 'asc' ? 1 : -1 })
        .populate('user_id', 'name')
        .exec((err, properties) => {
            if (err)
                return res
                    .status(404)
                    .json({ error: "Can't get user details!" });
            res.status(200).json(properties);
        });
    }
    if(req.query.limit) {
        Property.find({})
        .limit(req.query.limit)
        .populate('user_id', 'name')
        .exec((err, properties) => {
            if (err)
                return res
                    .status(404)
                    .json({ error: "Can't get user details!" });
            res.status(200).json(properties);
        });
    }
});

1 Ответ

1 голос
/ 03 июля 2019

Вы можете создать переменную options из своего тела запроса и передать ее в качестве третьего аргумента в запрос .find(), не нужно писать избыточный код с блоком if-else.

Для передачи аргумента в.find() запрос - projection, поэтому не забудьте передать туда пустой объект.

Попробуйте это:

let options={};
if(req.params.sortByPrice){
    options.sort = {
        price: req.params.sortByPrice === 'asc' ? 1 : -1 
    }
}
if(req.params.limit){
    options.limit = req.parms.limit
}

Property.find({},{},options)
    .populate('user_id', 'name')
    .exec((err, properties) => {
        if (err)
            return res
                .status(404)
                .json({ error: "Can't get user details!" });
        res.status(200).json(properties);
        return;
    });

Примечание. Не забудьте вернуться после res.status().json(),в противном случае вы можете получить ошибку cant set headers after they are sent.если вы попытаетесь отправить ответ снова.

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