РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsPmRpPR 145 of 168 menu
◀ ▶

Постраничная выдача в Nest

Пусть клиент листает список по страницам, а сервер отдаёт только записи без общего числа. Нельзя показать, сколько страниц осталось, если не знать размер всей таблицы.

Метод findAndCount за один вызов возвращает массив строк и их количество с учётом условия. Параметры take и skip задают окно, номер страницы из запроса переводят в сдвиг. Ответ удобно собрать объектом с двумя полями.

Покажем на примере постов:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class Post { @PrimaryGeneratedColumn() id: number; @Column() title: string; }

Сервис считает сдвиг по номеру страницы и возвращает записи с общим числом:

import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Post } from '../post.entity.js'; const PAGE_SIZE = 10; @Injectable() export class PostService { constructor( @InjectRepository(Post) private postRepository: Repository<Post>, ) {} async getPostsPage(page: number) { const skip = (page - 1) * PAGE_SIZE; const [items, total] = await this.postRepository.findAndCount({ take: PAGE_SIZE, skip, }); return { items, total }; } }

Контроллер читает страницу после пути как целое число:

import { Controller, Get, Query, ParseIntPipe, } from '@nestjs/common'; import { PostService } from './post.service.js'; @Controller('posts') export class PostController { constructor(private postService: PostService) {} @Get() getPosts(@Query('page', ParseIntPipe) page: number) { return this.postService.getPostsPage(page); } }

Модуль темы подключает сущность и регистрирует классы:

import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Post } from '../post.entity.js'; import { PostController } from './post.controller.js'; import { PostService } from './post.service.js'; @Module({ imports: [TypeOrmModule.forFeature([Post])], controllers: [PostController], providers: [PostService], }) export class PostsModule {}

Корневой модуль открывает базу и импортирует модуль постов:

import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { PostsModule } from './posts/posts.module.js'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'postgres', password: 'postgres', database: 'site', autoLoadEntities: true, synchronize: true, }), PostsModule, ], }) export class AppModule {}

Сделайте постраничный список работников с общим числом строк в WorkerService, номер страницы читайте из запроса в WorkerController и подключите WorkersModule к базе в корне.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить