NestJS整合TypeORM实战
我正在尝试将TypeORM整合到NestJS项目中,但在配置数据库连接时遇到了问题。按照官方文档配置了TypeOrmModule.forRoot(),但启动时总是报错"Unable to connect to database"。我的配置参数如下:
- 数据库使用的是PostgreSQL,连接参数确认无误
- 已经在app.module.ts中正确导入TypeOrmModule
- 实体类也按照要求用@Entity()装饰器进行了标记
想请教以下几个问题:
- 这种错误通常是什么原因导致的?有没有排查步骤建议?
- NestJS和TypeORM整合时有哪些常见陷阱需要注意?
- 实体类是否必须放在特定目录下?我的项目结构是否有特殊要求?
- 如何在开发和生产环境使用不同的数据库配置?
希望有实际整合经验的朋友能分享下解决方案,感谢!
3 回复
在NestJS中整合TypeORM非常简单。首先安装必要的依赖:
npm install @nestjs/typeorm typeorm mysql2 --save
然后在app.module.ts
中配置:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test_db',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 开发环境可用,生产禁用
}),
],
})
export class AppModule {}
接着创建实体类,例如user.entity.ts
:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
最后在服务中注入TypeORM:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
async findAll(): Promise<User[]> {
return this.usersRepository.find();
}
}
这样就完成了基本的整合与使用。
首先安装依赖:npm install @nestjs/common @nestjs/core @nestjs/platform-express typeorm mysql2 --save
创建NestJS项目:nest new project-name
。
配置数据库连接,在app.module.ts
中导入TypeORM模块并配置实体路径和数据源:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'testdb',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 开发环境可开启自动同步,生产禁用
}),
TypeOrmModule.forFeature([YourEntity]),
],
})
export class AppModule {}
创建实体类your.entity.ts
,定义表结构:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class YourEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
age: number;
}
创建服务层操作数据库,例如your.service.ts
:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { YourEntity } from './your.entity';
@Injectable()
export class YourService {
constructor(
@InjectRepository(YourEntity)
private readonly yourRepository: Repository<YourEntity>,
) {}
async create(entity: YourEntity): Promise<YourEntity> {
return await this.yourRepository.save(entity);
}
async findAll(): Promise<YourEntity[]> {
return await this.yourRepository.find();
}
}
最后在控制器中调用服务方法提供接口。这样就完成了基本的整合与实战。
NestJS整合TypeORM实战
NestJS与TypeORM的整合是构建Node.js后端应用的常见组合,下面我将介绍如何实现这种整合:
基本整合步骤
- 首先安装必要依赖:
npm install @nestjs/typeorm typeorm mysql2 # 根据数据库类型选择驱动
- 在AppModule中导入TypeOrmModule:
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql', // 数据库类型
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // 生产环境应设为false
}),
],
})
export class AppModule {}
实体定义
创建一个简单的用户实体:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
服务层使用
创建用户服务:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
async findAll(): Promise<User[]> {
return this.userRepository.find();
}
async create(user: User): Promise<User> {
return this.userRepository.save(user);
}
}
控制器示例
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get()
async findAll(): Promise<User[]> {
return this.userService.findAll();
}
@Post()
async create(@Body() user: User): Promise<User> {
return this.userService.create(user);
}
}
高级特性
- 关系:可以使用
@OneToMany
、@ManyToOne
等装饰器定义实体关系 - 事务:使用
@Transaction()
和@TransactionRepository()
- 迁移:通过TypeORM CLI创建和管理数据库迁移
整合TypeORM后,NestJS应用可以获得完整的ORM支持,简化数据库操作,同时保持代码的结构化和可测试性。