Nestjs教程使用TypeGraphQL与TypeORM结合构建高效API

在使用NestJS结合TypeGraphQL和TypeORM构建API时遇到几个问题:

  1. 如何正确配置TypeORM与NestJS的数据库连接?我的实体总是无法被TypeORM识别
  2. TypeGraphQL的@Resolver和NestJS的@Controller应该如何使用?两者是否会冲突?
  3. 在开发过程中遇到N+1查询问题,TypeORM的eager loading似乎不起作用,有什么优化建议?
  4. 使用TypeGraphQL的字段权限控制时,如何与NestJS的守卫(Guards)配合使用?
  5. 部署到生产环境后性能下降明显,有什么针对TypeORM和TypeGraphQL的性能调优方案?

目前项目使用的是PostgreSQL数据库,感觉TypeORM的查询生成效率不太理想,求教各位有经验的大佬该如何解决这些问题。


3 回复

首先安装必要的依赖:npm install @nestjs/graphql type-graphql typeorm reflect-metadata mysql2。接着创建TypeGraphQL的resolver类,例如@Resolver()装饰器标记查询和变更处理函数。在模块中启用TypeGraphQL,通过@UseMiddleware(JwtAuthGuard)添加认证。配置TypeORM连接,如TypeOrmModule.forRoot({type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'test', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true})。定义实体类并使用@ObjectType()装饰,映射数据库表结构。最后,确保反射元数据开启以支持装饰器功能,如在main.ts中加入initializeTransactionalContext()。通过以上步骤即可实现基于NestJS、TypeGraphQL与TypeORM的高效API构建。


要使用NestJS、TypeGraphQL和TypeORM构建高效API,首先初始化项目并安装必要的依赖:

npm install [@nestjs](/user/nestjs)/graphql type-graphql graphql apollo-server-express typeorm mysql2 reflect-metadata
  1. 配置TypeORM:在app.module.ts中配置数据库连接:

    import { TypeOrmModule } from '[@nestjs](/user/nestjs)/typeorm';
    
    [@Module](/user/Module)({
      imports: [
        TypeOrmModule.forRoot({
          type: 'mysql',
          host: 'localhost',
          port: 3306,
          username: 'root',
          password: '',
          database: 'testdb',
          entities: [__dirname + '/**/*.entity{.ts,.js}'],
          synchronize: true,
        }),
      ],
    })
    export class AppModule {}
    
  2. 定义实体:创建一个User.entity.ts

    import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
    
    [@Entity](/user/Entity)()
    export class User {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      name: string;
    
      @Column()
      email: string;
    }
    
  3. 创建GraphQL模块:使用TypeGraphQL定义Resolver:

    import { Resolver, Query, Args, Mutation } from 'type-graphql';
    import { InjectRepository } from '[@nestjs](/user/nestjs)/typeorm';
    import { Repository } from 'typeorm';
    import { User } from './user.entity';
    
    [@Resolver](/user/Resolver)()
    export class UserResolver {
      constructor(
        @InjectRepository(User)
        private usersRepo: Repository<User>,
      ) {}
    
      @Query(() => [User])
      async users(): Promise<User[]> {
        return this.usersRepo.find();
      }
    
      @Mutation(() => User)
      async createUser(@Args('name') name: string, @Args('email') email: string): Promise<User> {
        const user = this.usersRepo.create({ name, email });
        return this.usersRepo.save(user);
      }
    }
    
  4. 启用GraphQL:在app.module.ts中添加GraphQL模块:

    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { GraphQLModule } from '[@nestjs](/user/nestjs)/graphql';
    import { UserResolver } from './user.resolver';
    
    [@Module](/user/Module)({
      imports: [
        GraphQLModule.forRoot({
          autoSchemaFile: 'schema.gql',
        }),
      ],
      providers: [UserResolver],
    })
    export class AppModule {}
    

这样就搭建好了基本框架,可以开始开发更复杂的API了。

NestJS + TypeGraphQL + TypeORM 高效 API 构建指南

环境搭建

  1. 首先创建NestJS项目:
npm i -g @nestjs/cli
nest new project-name
cd project-name
  1. 安装必要依赖:
npm install typeorm @nestjs/typeorm graphql type-graphql @nestjs/graphql
npm install reflect-metadata class-validator

基础配置

  1. app.module.ts中配置:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { GraphQLModule } from '@nestjs/graphql';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres', // 根据实际数据库调整
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'password',
      database: 'test',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      autoSchemaFile: true,
    }),
  ],
})
export class AppModule {}

实体与Resolver创建

  1. 创建实体(示例为用户实体):
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
import { ObjectType, Field, ID } from 'type-graphql';

@ObjectType()
@Entity()
export class User {
  @Field(() => ID)
  @PrimaryGeneratedColumn()
  id: number;

  @Field()
  @Column()
  name: string;

  @Field()
  @Column()
  email: string;
}
  1. 创建Resolver:
import { Resolver, Query, Mutation, Args } from '@nestjs/graphql';
import { User } from './user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

@Resolver(() => User)
export class UserResolver {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  @Query(() => [User])
  async users(): Promise<User[]> {
    return this.userRepository.find();
  }

  @Mutation(() => User)
  async createUser(
    @Args('name') name: string,
    @Args('email') email: string,
  ): Promise<User> {
    const user = this.userRepository.create({ name, email });
    return this.userRepository.save(user);
  }
}

模块注册

在模块中注册实体和Resolver:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UserResolver } from './user.resolver';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserResolver],
})
export class UserModule {}

运行与测试

启动项目:

npm run start:dev

然后访问GraphQL Playground:http://localhost:3000/graphql

可以执行以下查询:

query {
  users {
    id
    name
    email
  }
}

或执行创建用户的Mutation:

mutation {
  createUser(name: "John", email: "john@example.com") {
    id
    name
    email
  }
}
回到顶部