Nodejs Nestjs分页插件nestjs-typeorm-pagination的使用

Nodejs Nestjs分页插件nestjs-typeorm-pagination的使用
nestjs-typeorm-pagination 是一个用于 NestJS 项目中实现分页功能的库。它简化了使用 TypeORM 进行分页查询的过程。以下是该插件的基本使用方法:

安装

首先,你需要安装 nestjs-typeorm-pagination@nestjs/pagination

npm install @nestjs/pagination nestjs-typeorm-pagination

配置

在你的模块文件(如 app.module.ts 或其他相关模块)中导入 TypeOrmModulePaginationModule

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PaginationModule } from '@nestjs/pagination';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'database_name',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    PaginationModule,
  ],
})
export class AppModule {}

使用

假设你有一个 User 实体和一个 UserService 服务。

User Entity

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

UserService

在你的服务中,你可以使用 @Paginate() 装饰器来处理分页逻辑:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Paginate, Paginated, PaginateQuery } from '@nestjs/pagination';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  @Paginate()
  async findAll(@PaginateQuery() query) {
    return this.userRepository.findAndCount({
      skip: query.offset,
      take: query.limit,
    });
  }
}

UserController

在控制器中,你可以定义一个 API 端点来获取分页数据:

import { Controller, Get } from '@nestjs/common';
import { Paginated } from '@nestjs/pagination';
import { UsersService } from './users.service';
import { User } from './user.entity';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  async findAll(): Promise<Paginated<User>> {
    return this.usersService.findAll();
  }
}

调用

现在,当你调用 /users 端点时,API 将返回分页后的用户列表。你可以通过传递 limitpage 参数来控制每页显示的记录数和当前页码。

例如:

  • /users?page=1&limit=10 表示获取第一页,每页显示 10 条记录。
  • /users?page=2&limit=20 表示获取第二页,每页显示 20 条记录。

这样,你就成功地在 NestJS 中使用了 nestjs-typeorm-pagination 插件来实现分页功能。


3 回复

当然,了解这个插件能让你的分页操作变得轻松愉快!nestjs-typeorm-pagination 是一个专门为 NestJS 设计的分页库,它基于 TypeORM,让你可以像喝咖啡一样简单地处理数据分页。

首先,你需要安装它:

npm install nestjs-typeorm-pagination

接着,在你的模块中导入 TypeOrmModulePaginationInterceptor

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PaginationInterceptor } from 'nestjs-typeorm-pagination';

@Module({
  imports: [
    TypeOrmModule.forRoot(),
    // 在这里注册你的实体
  ],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: PaginationInterceptor,
    },
  ],
})
export class AppModule {}

现在,你可以开始享受分页的乐趣了。假设你有一个 Post 实体,你可以这样写你的控制器方法:

import { Controller, Get, Query } from '@nestjs/common';
import { Post } from './post.entity';
import { Paginate, Paginated, PaginateQuery } from 'nestjs-typeorm-pagination';

@Controller('posts')
export class PostsController {
  @Get()
  findAll(
    @Paginate() query: PaginateQuery,
  ): Promise<Paginated<Post>> {
    return this.postRepository.findAndCount({
      skip: query.page && query.limit ? (query.page - 1) * query.limit : undefined,
      take: query.limit,
    });
  }
}

只需调用 /posts?page=1&limit=10,就能得到第一页,每页10条数据。是不是很简单?现在,去享受编写优雅代码的乐趣吧!


nestjs-typeorm-pagination 是一个为 NestJS 和 TypeORM 设计的分页库。它可以帮助你在处理大量数据时进行高效且易于管理的分页。下面我将指导你如何安装和使用这个库。

1. 安装

首先,你需要在你的 NestJS 项目中安装 nestjs-typeorm-pagination

npm install nestjs-typeorm-pagination

2. 配置

在你的模块文件(例如:app.module.ts)中,导入 TypeOrmModuleTypeormPaginationModule

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TypeormPaginationModule } from 'nestjs-typeorm-pagination';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'test',
      password: 'test',
      database: 'test',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    TypeormPaginationModule, // 添加此行
  ],
})
export class AppModule {}

3. 使用分页

假设你有一个实体类 User,你可以通过创建一个服务来实现分页逻辑。以下是如何实现的:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity'; // 假设你的用户实体是这样定义的
import { Pagination } from 'nestjs-typeorm-pagination';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  async findAll(page = 1, limit = 10): Promise<Pagination<User>> {
    return this.usersRepository.findAndCount({
      take: limit,
      skip: (page - 1) * limit,
    });
  }
}

这里我们定义了一个 findAll 方法,它接受 pagelimit 参数来确定当前页和每页显示的数据量。findAndCount 方法返回一个包含所有用户对象及其总数的对象,这符合 Pagination 类型的要求。

4. 控制器

最后,在控制器中调用这个方法并返回结果:

import { Controller, Get, Query } from '@nestjs/common';
import { UsersService } from './users.service';
import { ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';
import { Pagination } from 'nestjs-typeorm-pagination';

@ApiTags('Users')
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  @ApiQuery({ name: 'page', required: false, type: Number })
  @ApiQuery({ name: 'limit', required: false, type: Number })
  @ApiResponse({ status: 200, type: () => Pagination })
  async findAll(@Query('page') page: number = 1, @Query('limit') limit: number = 10): Promise<Pagination> {
    return this.usersService.findAll(page, limit);
  }
}

这样,你就可以通过 /users?page=1&limit=10 这样的 URL 来获取第一页的 10 条记录了。

nestjs-typeorm-pagination 是一个用于NestJS项目中实现分页功能的库。首先,你需要通过npm安装该库:

npm install nestjs-typeorm-pagination

然后,在你的服务中注入 TypeORMPagination 并使用它来生成分页数据:

import { TypeORMPagination } from 'nestjs-typeorm-pagination';
import { Repository } from 'typeorm';

@Injectable()
export class YourService {
  constructor(@InjectRepository(YourEntity) private readonly repo: Repository<YourEntity>) {}

  async findAll(page: number, limit: number): Promise<TypeORMPagination<YourEntity>> {
    return this.repo.findAndCount({
      take: limit,
      skip: (page - 1) * limit,
    });
  }
}

确保你的控制器方法调用服务中的分页逻辑,并将结果返回给客户端。

回到顶部