Разбиение на страницы — важнейшая функция во многих приложениях, работающих с большими наборами данных. В этой статье блога мы рассмотрим, как реализовать нумерацию страниц с помощью NestJS, TypeORM и концепции максимального значения глобального предела. Мы углубимся в различные методы и приемы для достижения эффективной и масштабируемой нумерации страниц в ваших приложениях NestJS.
Метод 1: базовое разбиение на страницы со смещением и ограничением
Самый простой метод разбиения на страницы предполагает использование в запросах параметров offset
и limit
. Давайте рассмотрим пример:
import { PaginationQueryDto } from './dto/pagination-query.dto';
async findAll(paginationQuery: PaginationQueryDto) {
const { limit, offset } = paginationQuery;
return await this.repository.find({
skip: offset,
take: limit,
});
}
Метод 2: разбиение на страницы на основе курсора
Разбиение на страницы на основе курсора — это альтернативный подход, основанный на использовании уникального идентификатора для разбиения на страницы записей. Этот метод особенно полезен при работе с данными в реальном времени или когда пользователям необходимо перемещаться по большому набору данных. Вот пример:
import { PaginationQueryDto } from './dto/pagination-query.dto';
async findAll(paginationQuery: PaginationQueryDto) {
const { after, limit } = paginationQuery;
const queryBuilder = this.repository.createQueryBuilder('entity');
if (after) {
queryBuilder.where('entity.id > :after', { after });
}
const entities = await queryBuilder
.orderBy('entity.id')
.take(limit)
.getMany();
return entities;
}
Метод 3: реализация максимального значения глобального ограничения
Чтобы обеспечить глобальное ограничение на количество возвращаемых записей, вы можете использовать промежуточное программное обеспечение или перехватчик. Вот пример использования перехватчика для ограничения максимального количества возвращаемых записей:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class GlobalLimitInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const request = context.switchToHttp().getRequest();
const { limit } = request.query;
if (limit > 100) {
request.query.limit = 100;
}
return next.handle();
}
}
Чтобы применить перехватчик глобально, вы можете использовать поставщик APP_INTERCEPTOR
в файле main.ts
:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new GlobalLimitInterceptor());
await app.listen(3000);
}
bootstrap();
В этой статье мы рассмотрели несколько методов реализации нумерации страниц в NestJS с использованием TypeORM. Мы рассмотрели базовую нумерацию страниц со смещением и пределом, а также нумерацию страниц на основе курсора. Кроме того, мы обсудили реализацию глобального максимального значения предела с использованием перехватчика для обеспечения соблюдения ограничений на количество возвращаемых записей. Понимая и применяя эти методы, вы сможете создавать масштабируемые и эффективные решения для разбиения на страницы в своих приложениях NestJS.