2

Nestjs 以monorepo模式开启项目之旅(一)

monorepo mode 见官网

创建项目

nest n fullstackone

创建子项目

nest g app admin
admin 是一个项目名称

创建数据库

一切向java spring看齐, 以mysql为数据库

表结构如下:

uuid varchar keyprimary
name varchar
sex int
create_time date
update_time date
创建db库
nest g lib db

因为db库是公用的,不受限于某个子项目,所以用lib的形式创建

创建model类

libs/db/src/model/student.model.ts
import { Entity, PrimaryColumn, Column } from 'typeorm';

@Entity({ name: 'student' })
export class Student {
  @PrimaryColumn()
  uuid: string

  @Column()
  name: string

  @Column()
  sex: number

  @Column({ name: 'create_time' })
  createTime: Date

  @Column({ name: 'update_time' })
  updateTime: Date
}
这里用到了mysql 和 typeorm库
yarn add mysql @nestjs/typeorm typeorm
修改db module类
libs/db/src/db.module.ts
import { Module } from '@nestjs/common';
import { DbService } from './db.service';
import { TypeOrmModule } from '@nestjs/typeorm'
import { Student } from './model/student.model';
import { Connection } from 'typeorm';

const models = TypeOrmModule.forFeature([Student])

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: '123',
      database: 'nestjs',
      entities: [Student], // 引入student实体类
      synchronize: true
    }),
    models
  ],
  providers: [DbService],
  exports: [DbService, models],
})
export class DbModule {
  constructor(private readonly connection: Connection) { }
}
创建student module

在db中创建好student.model后,在admin子项目中创建student的controller service 和 mudle

nest g co student
nest g mo student
nest g s student

创建好后,nest会修改app.module,也就是根模块,如下:

  imports: [
    DbModule,
    StudentModule,
  ],

nest通过imports将几个子模块关联起来了,也可以说是子模块创建后必须得在根模块中注册

controller基本只负责简单逻辑,如下:

admin/src/student/student.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { StudentService } from './student.service';

@Controller('student')
export class StudentController {
  constructor(private readonly studentService: StudentService) { }

  @Get()
  findAll() {
    return this.studentService.findAll();
  }

  @Get(':id')
  findById(@Param('id') id) {
    return this.studentService.findById(id);
  }
}

controller中依赖注入了student的service。

service 负责逻辑部分。
首先得要操作数据库,得依赖注入db模块

constructor(@InjectRepository(Student) private readonly studentRepository: Repository<Student>){}

完整如下:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Student } from '@app/db/model/student.model';
import { Repository } from 'typeorm';
import { LoggerService } from '@app/logger';

@Injectable()
export class StudentService {
  constructor(@InjectRepository(Student) private readonly studentRepository: Repository<Student>) { }

  findAll() {
    return this.studentRepository.find();
  }

  findById(uuid: string) {
    return this.studentRepository.findOne({ where: { uuid } });
  }
}
运行

进入项目文件夹,运行admin子项目

nest start -w admin

浏览器或postman输入

http://localhost:3000/student

添加日志模块

nestjs作为渐进式架构,肯定是能一块一块的加功能了。

创建日志模块

nest g lib logger

修改logger.service.ts

import { Injectable, Logger } from '@nestjs/common';

@Injectable()
export class LoggerService extends Logger{
  
}

在需要logger模块的地方引入

imports: [
    DbModule,
    LoggerModule,
    StudentModule,
],

在需要的地方,首先依赖注入 然后就可以使用了,如下:

constructor(@InjectRepository(Student) private readonly studentRepository: Repository<Student>, private readonly logger: LoggerService) { }

findById(uuid: string) {
    this.logger.log(`student findById: param -> ${uuid}`);
    return this.studentRepository.findOne({ where: { uuid } });
  }

在main.ts中配置logger需要过滤的等级

等级有这些选项 'log','error','warn','debug', 'verbose'
async function bootstrap() {
  const app = await NestFactory.create(AppModule, { logger: ['error', 'warn', 'log'] });
  await app.listen(3000);
}
bootstrap();

陈东民
2.1k 声望269 粉丝

坚持自我 纯粹的技术