#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);
}
});