Добавить разбивку на страницы и сортировку в качестве промежуточного ПО в Mongoose (node.js , экспресс-RestAPI)

#node.js #express #mongoose

#node.js #экспресс #mongoose

Вопрос:

Есть ли способ добавить параметры ограничения, пропуска и сортировки (как показано ниже) ко всем запросам без необходимости определять их для каждой конечной точки (вроде как промежуточное программное обеспечение)? Я хочу, чтобы мои запросы проверяли параметры limit, skip и sortBy в URL-адресе запроса и соответственно добавляли соответствующие параметры.

 // Fetch all movies: GET /
router.get("/", async (req: Request, res: Response) => {
  try {
    const movies = await Movie.find().limit(req.query.limit).skip(req.query.skip).sort({title: 1});
    res.json(movies);
  } catch (err) {
    res.json({ message: err });
    console.log(err);
  }
});
  

Комментарии:

1. Можете ли вы написать общую функцию и передать ей параметры вашего запроса и вернуть mongoosequery на основе параметров запроса, которые вы передали функции, и повторно использовать функцию везде. Это правильно решает проблему

2. Спасибо! Я думаю, это то, что я сделал (см. Мое решение)

Ответ №1:

Я придумал достойное решение: я создал класс SearchOptions, который принимал запрос и содержал нужные мне параметры:

 class SearchOptions {
    limit: number | null;
    skip: number | null;
    sort: object | null;

    constructor(query: any) {
        this.limit = query.limit ? parseInt(query.limit) : null;
        this.skip = (query.page amp;amp; this.limit) ? (parseInt(query.page)-1) * this.limit : null;
        this.sort = {};

        if(query.sortBy) {
            const sortStr = query.sortBy.split(':');
            this.sort[sortStr[0]] = sortStr[1] === 'desc' ? -1 : 1
        } 
    }
}

export default SearchOptions;
  

Затем я просто создал новый экземпляр объекта в моем маршруте:

 // Fetch all movies: GET /
router.get("/", async (req: Request, res: Response) => {
  try {
    const movies = await Movie.find({}, null, new SearchOptions(req.query));
    res.json(movies);
  } catch (err) {
    res.json({ message: err });
    console.log(err);
  }
});