1. 新建项目
nest new myproject
2. 创建模块
nest g mo modulename
nest g co modulename
3. 创建库
nest g lib db
?What prefix would like to use for the library (default: @app)? @libs
4. 安装typegoose
yarn add nestjs-typegoose @typegoose/typegoose mongoose
yarn add --dev @types/mongoose
5. 连接数据库
-
在 db.module.ts 中连接数据库,下面 imports 为手动新增的内容
@Module({ imports: [TypegooseModule.forRoot("mongoodb://localhost:27017/test", { useCreateIndex: true, useFindAndModify: false, useNewUrlParser: true, useUnifiedTopology: true, })], providers: [DbService], exports: [DbService], })
6.创建数据表模型
- /libs/db/src 新建 model 文件夹存放数据库模型
- 新建 model
import { prop } from '@typegoose/typegoose' export class MyModule { @prop() title: string @prop() content: string }
6.导出数据库模型
-
在 db.module.ts 中 imports 导入上述的数据表模型,在 exports 导出
import { MyModule } from './model/mymodule.model'; const models = TypegooseModule.forFeature([ MyModule, ]) @Module({ imports: [TypegooseModule.forRoot("mongoodb://localhost:27017/test", { useCreateIndex: true, useFindAndModify: false, useNewUrlParser: true, useUnifiedTopology: true, }),models], providers: [DbService], exports: [DbService, models], }) export class DbModule {}
7. 编写控制器
-
在 modelname.model.ts 中导入 DbModule,则控制器可以使用 DbModule
@Module({ imports: [DbModule], controllers: [ModulenameController] })
-
编写控制器
在 modulename.controller.ts注入MyModule
import { MyModule } from '@libs/db/model/mymodule.model'; export class ModulenameController { constructor(@InjectModel(MyModule) private readonly MyModule:ModelType<MyModule>){} @Get() async index(){ return await this.MyModule.find() } @Post() async create(@Body() createDto:MyModule){ return await this.MyModule.create(createDto) } @Get(':id') async detail(@Param('id') id:string){ return await this.MyModule.findById(id) } @Put(':id') async update(@Param('id') id:string, updateDto:MyModule){ await this.MyModule.findByIdAndUpdate(id, updateDto) return { success: true } } @Delete(':id') async remove(@Param('id') id:string){ return await this.MyModule.findByIdAndDelete(id) } }
8. 生成API文档
-
安装 swagger
yarn add @nestjs/swagger swagger-ui-express
-
main.ts 创建文档
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; async function bootstrap() { const app = await NestFactory.create(AppModule); const options = new DocumentBuilder() .setTitle('MyAPI') .setDescription('My API') .setVersion('0.1') .build(); const document = SwaggerModule.createDocument(app, options); SwaggerModule.setup('api-docs', app, document); await app.listen(5000); console.log('http://localhost:5000/api-docs'); } bootstrap();
-
添加文档装饰器
- @ApiTags() 路由分组
- @ApiProperty() http 方法注释
- @ApiProperty() Schema 数据表结构描述和示例等
import { ApiProperty } from '@nestjs/swagger' import { prop } from '@typegoose/typegoose' export class MyModule { @ApiProperty({description:'标题', example:'标题1'}) @prop() title: string @ApiProperty({description:'内容', example:'内容1'}) @prop() content: string }
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common'; import { InjectModel } from 'nestjs-typegoose' import { ModelType } from '@typegoose/typegoose/lib/types'; import { MyModule } from '@libs/db/model/mymodule.model'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; @ApiTags('mymodule') @Controller('modulename') export class ModulenameController { constructor(@InjectModel(MyModule) private readonly MyModule:ModelType<MyModule>){} @ApiOperation({summary:'列表'}) @Get() async index(){ return await this.MyModule.find() } @ApiOperation({summary:'创建'}) @Post() async create(@Body() createDto:MyModule){ return await this.MyModule.create(createDto) } @ApiOperation({summary:'详情'}) @Get(':id') async detail(@Param('id') id:string){ return await this.MyModule.findById(id) } @ApiOperation({summary:'更新'}) @Put(':id') async update(@Param('id') id:string, @Body() updateDto:MyModule){ return await this.MyModule.findByIdAndUpdate(id, updateDto) } @ApiOperation({summary:'删除'}) @Delete(':id') async remove(@Param('id') id:string){ return await this.MyModule.findByIdAndDelete(id) } }
9. 全局模块
- @GLobal()
import { MyModule } from './model/mymodule.model'; import { Global, Module } from '@nestjs/common'; import { TypegooseModule } from 'nestjs-typegoose'; import { DbService } from './db.service'; const models = TypegooseModule.forFeature([MyModule]); @Global() @Module({ imports: [ TypegooseModule.forRoot('mongodb://localhost:27017/test', { useCreateIndex: true, useFindAndModify: false, useNewUrlParser: true, useUnifiedTopology: true, }), models, ], providers: [DbService], exports: [DbService, models], }) export class DbModule {}
- 在根模块 app.module.ts 注册 DbModule
现在不需要在其它模块再导入 DbModuleimport { DbModule } from '@libs/db'; import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ModulenameModule } from './modulename/modulename.module'; @Module({ imports: [ModulenameModule,DbModule], controllers: [AppController], providers: [AppService], }) export class AppModule {}