【无标题】

创建个 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 了。

相关推荐
葫芦和十三1 小时前
图解 MongoDB 04|索引模型:每建一个索引,就是在 B+-tree 森林里多栽一棵
后端·mongodb·agent
anOnion2 小时前
构建无障碍组件之Menu Button pattern
前端·html·交互设计
用户47949283569152 小时前
claude Fable用不了?把Gpt 5.5pro接到你的claude code里
前端·后端
GetcharZp4 小时前
告别 Nginx 复杂配置!这款带 Web 面板的万能代理神器,让端口转发变得如此简单
后端
zhangxingchao5 小时前
Kotlin常用的Flow 操作符整理
前端
IT_陈寒6 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
Pedantic7 小时前
SwiftUI 手势笔记
前端·后端
金銀銅鐵7 小时前
[Python] 从《千字文》中随机挑选汉字
后端·python
橙子家8 小时前
浏览器缓存之【结构化数据库与缓存】: IndexedDB、Cache storage 和 Storage buckets
前端