NestJS整合TypeORM实战

我正在尝试将TypeORM整合到NestJS项目中,但在配置数据库连接时遇到了问题。按照官方文档配置了TypeOrmModule.forRoot(),但启动时总是报错"Unable to connect to database"。我的配置参数如下:

  1. 数据库使用的是PostgreSQL,连接参数确认无误
  2. 已经在app.module.ts中正确导入TypeOrmModule
  3. 实体类也按照要求用@Entity()装饰器进行了标记

想请教以下几个问题:

  1. 这种错误通常是什么原因导致的?有没有排查步骤建议?
  2. NestJS和TypeORM整合时有哪些常见陷阱需要注意?
  3. 实体类是否必须放在特定目录下?我的项目结构是否有特殊要求?
  4. 如何在开发和生产环境使用不同的数据库配置?

希望有实际整合经验的朋友能分享下解决方案,感谢!


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后端应用的常见组合,下面我将介绍如何实现这种整合:

基本整合步骤

  1. 首先安装必要依赖:
npm install @nestjs/typeorm typeorm mysql2  # 根据数据库类型选择驱动
  1. 在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);
  }
}

高级特性

  1. 关系:可以使用@OneToMany@ManyToOne等装饰器定义实体关系
  2. 事务:使用@Transaction()@TransactionRepository()
  3. 迁移:通过TypeORM CLI创建和管理数据库迁移

整合TypeORM后,NestJS应用可以获得完整的ORM支持,简化数据库操作,同时保持代码的结构化和可测试性。

回到顶部