Nestjs教程使用TypeGraphQL与TypeORM结合构建高效API
在使用NestJS结合TypeGraphQL和TypeORM构建API时遇到几个问题:
- 如何正确配置TypeORM与NestJS的数据库连接?我的实体总是无法被TypeORM识别
- TypeGraphQL的@Resolver和NestJS的@Controller应该如何使用?两者是否会冲突?
- 在开发过程中遇到N+1查询问题,TypeORM的eager loading似乎不起作用,有什么优化建议?
- 使用TypeGraphQL的字段权限控制时,如何与NestJS的守卫(Guards)配合使用?
- 部署到生产环境后性能下降明显,有什么针对TypeORM和TypeGraphQL的性能调优方案?
目前项目使用的是PostgreSQL数据库,感觉TypeORM的查询生成效率不太理想,求教各位有经验的大佬该如何解决这些问题。
首先安装必要的依赖: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
-
配置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 {}
-
定义实体:创建一个
User.entity.ts
:import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; [@Entity](/user/Entity)() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() email: string; }
-
创建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); } }
-
启用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 构建指南
环境搭建
- 首先创建NestJS项目:
npm i -g @nestjs/cli
nest new project-name
cd project-name
- 安装必要依赖:
npm install typeorm @nestjs/typeorm graphql type-graphql @nestjs/graphql
npm install reflect-metadata class-validator
基础配置
- 在
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创建
- 创建实体(示例为用户实体):
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;
}
- 创建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
}
}