【无标题】

创建个 Nest 项目

bash 复制代码
nest new nest-typeorm -p npm

创建一个 crud 的模块:

bash 复制代码
nest g resource user

引入 typeorm

bash 复制代码
npm install --save @nestjs/typeorm typeorm mysql2

修改 app.modules.ts

forRoot 方法解析

forRoot、register、forFeature 这三个是注册动态模块的三种方式

  • forRoot 用于在**根模块(AppModule)**中注册一个模块的全局配置。通常只调用一次,用于创建全局单例。上述配置就是告诉 NestJS 启动时要创建一个 TypeORM 连接。

  • registerforRoot 类似,通常用于需要"多实例"多次调用或"局部配置"的场景。

    ts 复制代码
    @Module({
      imports: [
        CacheModule.register({ ttl: 5 }),    // A模块
        CacheModule.register({ ttl: 60 }),   // B模块
      ],
    })
  • forFeature 通常用于那些支持模块分片加载的库模块 , 例如:TypeOrmModuleMongooseModule。这些模块一般通过 forRoot 注册全局连接,再通过 forFeature 注册具体的实体(Entity)或模型(Model)。

    ts 复制代码
    @Module({
      imports: [
        TypeOrmModule.forRoot({
          type: 'mysql',
          host: 'localhost',
          username: 'root',
          password: '123456',
          database: 'test',
          synchronize: true,
        }),
        TypeOrmModule.forFeature([User]), // 注册实体
      ],
      providers: [UserService],
    })
    export class UserModule {}

修改 User Entity

ts 复制代码
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity({
  name: 'sanshi_user',
})
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({
    name: 'sanshi_name',
    length: 50,
  })
  name: string;
}

执行 npm run start

增删改查

修改 user.service.ts 来完成对数据库的增删改查操作。

通过在 UserService 注入 EntityManager 来完成对应操作。

ts 复制代码
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { InjectEntityManager } from '@nestjs/typeorm';
import { EntityManager } from 'typeorm';
import { User } from './entities/user.entity';

@Injectable()
export class UserService {
  @InjectEntityManager()
  private manager: EntityManager;

  create(createUserDto: CreateUserDto) {
    return this.manager.save(User, createUserDto);
  }

  findAll() {
    return this.manager.find(User);
  }

  findOne(id: number) {
    return this.manager.findOne(User, { where: { id } });
  }

  update(id: number, updateUserDto: UpdateUserDto) {
    return this.manager.save(User, { id, ...updateUserDto });
  }

  remove(id: number) {
    return this.manager.delete(User, { id });
  }
}

执行 npm run start:dev。


通过 postman 进行新增操作

服务端可以看到对应日志


查询所有

查询单个


修改


删除


优化

因为使用的是通过 @InjectEntityManager 来注入的 entityManager 对象,所以每个 api 都需要带上对应的 Entity。

这个时候可以通过前边提到的 forFeature 来做一个优化。

在 user.module.ts 中做对应修改: 在 user 模块引入 TypeOrmModule.forFeature 对应的动态模块,传入 User 的 Entity

然后在 userService 中就可以注入 Repository,从而使用各个 api 的时候就不需要单独传入 User Entity 了。

相关推荐
SWAGGY..10 分钟前
【C++初阶】:(15)模板进阶--从非类型参数到模板特化与分离编译
java·服务器·前端
YHHLAI11 分钟前
从「跑分」到「干活」:Benchmark 与 GPT 5.6 的两种叙事
大数据·前端·人工智能·react.js·前端框架
BigTopOne15 分钟前
ArLiveLite 用到的 C++/JNI 技术点
前端
BigTopOne15 分钟前
ArLiveLite 技术架构-Lite
前端
BigTopOne20 分钟前
ArLiveLite-具体功能
前端
摇滚侠21 分钟前
《SpringBoot 3:入门与应用实战》第 6 章 Spring Boot 最佳实践 阅读笔记 11
spring boot·笔记·后端
BigTopOne24 分钟前
ArLiveLite -具体功能
前端
Sherotree26 分钟前
理解 JWT:三段分别是什么
前端·ai·开源
BigTopOne26 分钟前
ArLiveLite 用到的 FFmpeg API
前端
BigTopOne33 分钟前
ArLiveLite -功能架构详解
前端