nestjs+mongodb后端CRUD

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
    import { 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 {}
    
    现在不需要在其它模块再导入 DbModule
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值