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){}
完整如下:
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) { }
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, 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();