【无标题】

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

相关推荐
standovon13 分钟前
Spring Boot整合Redisson的两种方式
java·spring boot·后端
Novlan119 分钟前
我把 Claude Code 里的隐藏彩蛋提取出来了——零依赖的 ASCII 虚拟宠物系统
前端
Cosolar44 分钟前
LlamaIndex RAG 本地部署+API服务,快速搭建一个知识库检索助手
后端·openai·ai编程
IAUTOMOBILE1 小时前
Python 流程控制与函数定义:从调试现场到工程实践
java·前端·python
好大哥呀1 小时前
C++ Web 编程
开发语言·前端·c++
MX_93591 小时前
SpringMVC请求参数
java·后端·spring·servlet·apache
忆想不到的晖2 小时前
Codex 探索:别急着调 Prompt,先把工作流收住
后端·agent·ai编程
爱学习的小仙女!2 小时前
面试题 前端(一)DOCTYPE作用 标准模式与混杂模式区分
前端·前端面试题
weixin_408099672 小时前
【实战对比】在线 OCR 识别 vs OCR API 接口:从个人工具到系统集成该怎么选?
图像处理·人工智能·后端·ocr·api·图片文字识别·文字识别ocr
小小小小宇3 小时前
前端转后端基础- 变量和类型
前端