1. 程式人生 > 實用技巧 >Nest.js —— A progressive Node.js framework

Nest.js —— A progressive Node.js framework

1.nest指令

nest <command> [options]

Options:
    -h
    -v
Commands:
    new|n [options] [name]
    build [options] [app]
    start [options] [app]
    generate|g [options] <schematic> [name] [path]

    schematics:
        application|app
        module|mo
        controller|co
        library
|lib

2.控制器

控制器負責處理傳入的 請求 和向客戶端返回 響應

// cats.controller.ts

import { Controller, Get } from '@nestjs/common';

class CreateCatDto {
  @ApiProperty({ description: '名稱' }) // 模型屬性
  name: string
}

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats
'; } @Post() create(@Body() body: CreateCatDto ) { return { success: true } } } // localhost:3000/cats

在上面的示例中,當對此端點發出 GET 請求時,Nest 會將請求路由到我們的使用者定義 findAll() 方法。請注意,我們在此處選擇的函式名稱完全是任意的。我們顯然必須宣告一個繫結路由的函式,但 Nest 不會對所選的函式名稱附加任何意義。

預設情況下,響應的狀態碼總是200,除了 POST 請求外,此時它是201,我們可以通過在處理程式層新增@HttpCode(...)

裝飾器來輕鬆更改此行為。

3.swagger

$ npm install --save @nestjs/swagger swagger-ui-express

開啟引導檔案(主要是 main.ts )並使用 SwaggerModule 類初始化 Swagger:

const options = new DocumentBuilder()
    .setTitle('Cats example')
    .setDescription('The cats API description')
    .setVersion('1.0')
    .addTag('cats')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api-docs', app, document);

裝飾器

@ApiProperty({ description: '...', example: '...' })  // 模型屬性
@ApiTags()
@ApiOperation({ summary: 'description...' })  // 介面描述

4.資料庫

$ npm install --save @typegoose/typegoose nestjs-typegoose mongoose   NPM

$ npm install --save-dev @types/mongoose

連線mongodb

// db.module.ts

import { Module } from "@nestjs/common";
import { TypegooseModule } from "nestjs-typegoose";
import { CatsModule } from "./cat.module.ts";
 
@Module({
  imports: [
    TypegooseModule.forRoot("mongodb://localhost:27017/nest", {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useCreateIndex: true,
      useFindAndModify: true
    }),
    CatsModule,
  ],
})
export class ApplicationModule {}

定義模型

// cat.model.ts

import { prop } from "@typegoose/typegoose";
 
export class Cat {
  @prop({ required: true })
  name: string;
}

全域性引用模型

// db.module.ts

import { Module, Global } from '@nestjs/common';
import { DbService } from './db.service';
import { TypegooseModule } from 'nestjs-typegoose'
import { Cat } from './models/cat.model'

const models = TypegooseModule.forFeature([Cat])

@Global()
@Module({
  imports: [
    ...(連線資料庫),
    models
  ],
  providers: [DbService],
  exports: [DbService, models],
})
export class DbModule {}

依賴注入

// cats.controller.ts

import { Controller } from '@nestjs/common';
import { InjectModel } from 'nestjs-typegoose';
import { Cat } from '@libs/db/models/user.model';
import { ApiTags } from '@nestjs/swagger';

@Controller('users')
@ApiTags('使用者')
export class UsersController {
  constructor(@InjectModel(Cat) private readonly model) {}
}