NestJS企业级项目模块化配置怎么做

NestJS企业级项目模块化配置怎么做

抽离实体entity

javascript 复制代码
/ src/common/entity/index.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { User } from './modules/user/user.entity';

export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'mysql', // 可以选择其他数据库,如 MySQL
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: '123456',
  database: 'nexusnest',
  entities: [User],
  synchronize: true,
};

主模块之中使用

javascript 复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './modules/user/user.module';
import { typeOrmConfig } from './common/entity/index';  // 导入 typeOrmConfig 配置
@Module({
  imports: [
    TypeOrmModule.forRoot(typeOrmConfig), 
    // 在 AppModule 中导入 TypeOrmModule.forRoot() 方法,并传入 typeOrmConfig 配置,
    UserModule,
  ],
})
export class AppModule {}

配置公共路径@

👉 在tsconfig.json职中进行配置项目公共路径,配置完直接可以@访问src下面的路径内容

javascript 复制代码
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

之前我们已经搭建好了数据库,接下来我们就将user用户模块给封装起来,尝试写一个用户模块

把我们之前写好的用户模块给抽离出来为user.module.ts,其他模块也放到user模块下面

javascript 复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { User } from './user.entity';
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

命令式生成

这里我们直接拿命令就可以帮助我们搭建目录和文件

javascript 复制代码
// 检测自己的nest版本
nest --version

我本地是11.0.6的版本,没有检测到版本就是你之前忘记了安装
// 安装命令(已安装的忽略)
npm install -g @nestjs/cli

// 搭建
nest generate module modules/user


// 具体命令 
nest generate module modules/user
nest generate controller modules/user
nest generate service modules/user

安装完成以后我们目录结构就会成为

javascript 复制代码
├─src
│  ├─modules
│  │   └─user 
│  

// user 下面包含的文件
user.controller.spec.ts
user.controller.ts
user.module.ts
user.service.spec.ts
user.service.ts

配置去掉测试文件

我们发现user下面除了生成我们需要的三个文件还生成了user.service.spec.ts之类带spec的文件,这个就是测试文件

方式一(命名时候去掉 --采用 )

javascript 复制代码
// 命名时候去掉
nest generate module modules/user --no-spec


// 完整跳过命令
nest generate module modules/user --no-spec
nest generate controller modules/user --no-spec
nest generate service modules/user --no-spec

方式二(没成功----跳过)

全局禁用在根目录文件nest-cli.json之中去掉

javascript 复制代码
nest-cli.json

"generateOptions": {
    "spec": false
 }

抽离用户模块

这里我们就把我们需要的模块全部进行了对应的抽离

整个NestJS的数据过程如下:controller => service => module

user= > user.entity.ts
javascript 复制代码
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('users')
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;
}
user= > user.controller.ts
javascript 复制代码
import { Controller, Get, Post, Param, Body, Put, Delete } 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();
  }
}
user= > user.service.ts
javascript 复制代码
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();
  }
}
user= > user.module.ts
javascript 复制代码
// src/user/user.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
  imports: [TypeOrmModule.forFeature([User])],  // 导入实体
  controllers: [UserController],               // 注册控制器
  providers: [UserService],                 // 注册服务
})
export class UserModule {}

主模块引入UserModule

javascript 复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserController } from './modules/user/user.controller';
import { UserService } from './modules/user/user.service';
import { User } from './modules/user/user.entity';
import { UserModule } from './user.module';
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql', // 可以选择其他数据库,如 MySQL
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'XXXXXX',
      database: 'nexusnest',
      entities: [User],
      synchronize: true,
    }),
    UserModule,
  ],
  // controllers: [UserController],
  // providers: [UserService],
})
export class AppModule {}

这里我们也可以将entities之中的实体全部抽离出来

设置接口前缀setGlobalPrefix

javascript 复制代码
// 设置全局接口前缀
  app.setGlobalPrefix('api/v1');

设置端口号

javascript 复制代码
await app.listen(process.env.PORT ?? 8888);
相关推荐
晚霞的不甘6 小时前
Flutter for OpenHarmony天气卡片应用:用枚举与动画打造沉浸式多城市天气浏览体验
前端·flutter·云原生·前端框架
苏三说技术7 小时前
xxl-job 和 elastic-job,哪个更好?
后端
xkxnq7 小时前
第五阶段:Vue3核心深度深挖(第74天)(Vue3计算属性进阶)
前端·javascript·vue.js
三小河7 小时前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
Hilaku7 小时前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
三小河7 小时前
前端视角详解 Agent Skill
前端·javascript·后端
牛奔7 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
Aniugel7 小时前
单点登录(SSO)系统
前端
颜酱7 小时前
二叉树遍历思维实战
javascript·后端·算法
鹏多多7 小时前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js