初識nest.js


nest的核心概念:

Nest的核心概念是提供一種體系結構,它幫助開發人員實現層的最大分離,並在應用程序中增加抽象。

架構預覽:

主要有三個核心概念:模塊Module,  控制器Controller, 服務與依賴注入 Provider Dependency injection

  1. 模塊Module:   用於將代碼拆分為獨立的和可重用的模塊,例如用戶信息模塊,然后將該用戶模塊的控制器和服務集合進來,最后直接將用戶模塊導入到根Module就可以使用了。
  2. 控制器Controller: 負責處理客戶端傳入的請求參數並向客戶端返回響應數據。nest.js提供許多http請求的裝飾器,如例如@Body(),@Post()等。控制器不需要定義任何諸如從客戶端獲取數據、驗證用戶輸入等工作,這些都是交給服務Provider處理,通過把任務委托給各種服務,可以讓控制器類更加精簡、高效。
  3. 服務Provider :在這里處理所有請求執行邏輯,在控制器中通過constructor函數以依賴注入的方式實現。
    constructor(private readonly catsService: CatsService) {}

     

其他概念:

中間件Middleware: 中間件功能可以訪問請求和響應對象,在路由處理程序之前調用。

// 實現一個帶有`@Injectable()`裝飾器的類打印中間件
import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  resolve(...args: any[]): MiddlewareFunction {
    return (req, res, next) => {
      console.log('Request...');
      next();
    };
  }
}

使用有兩種方式:全局注冊和局部模塊注冊。

//  全局注冊
async function bootstrap() {
  // 創建Nest.js實例
  const app = await NestFactory.create(AppModule, application, {
    bodyParser: true,
  });
  // 注冊中間件
  app.use(LoggerMiddleware());
  // 監聽3000端口
  await app.listen(3000);
}
bootstrap();
//  模塊局部注冊
export class CnodeModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .with('ApplicationModule')
      .exclude(
        { path: 'user', method: RequestMethod.GET },
        { path: 'user', method: RequestMethod.POST },
      )
      .forRoutes(UserController);
  }
}

全局注冊影響全部路由,局部注冊只是影響當前路由下的路由。

 

過濾器Exception filter:負責在整個應用程序中處理所有拋出的異常,同時可以自定義錯誤狀態碼和錯誤消息內容。

管道 Pipe:管道可以把你的請求參數根據特定條件驗證類型、對象結構或映射數據。管道是一個純函數,不應該從數據庫中選擇或調用任何服務操作。

守衛 Guard:通常用作權限認證

 

他們之間的執行順序:

客戶端請求 ---> 中間件 ---> 守衛 ---> 攔截器之前 ---> 管道 ---> 控制器處理並響應 ---> 攔截器之后 ---> 過濾器

 

安裝:

npm i -g @nestjs/cli

 初始化項目:

$ nest new my-awesome-app
或者
$ nest n my-awesome-app

初始化完成之后,需要創建模塊,控制器等,除了手動創建,可以直接用命令的方式創建,以下是常用的創建的命令:

class (簡寫: cl) 類
controller (簡寫: co) 控制器
decorator (簡寫: d) 裝飾器
exception (簡寫: e) 異常捕獲
filter (簡寫: f) 過濾器
gateway (簡寫: ga) 網關
guard (簡寫: gu) 守衛
interceptor (簡寫: i) 攔截器
middleware (簡寫: mi) 中間件
module (簡寫: mo) 模塊
pipe (簡寫: pi) 管道
provider (簡寫: pr) 供應商
service (簡寫: s) 服務

例如創建一個car的module,可以使用nest g mo car

 

了解了框架的基本內容之后,就可以連接數據庫進行CURD練習上手了。

這里用的是Mysql,先安裝基本包:

npm install --save @nestjs/typeorm typeorm mysql

這里用typeorm基本數據庫操作,如對typeorm不熟悉可以點擊這里了解:typeorm

安裝完之后在app.module.ts中設置數據庫

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PhotoModule } from './photo/photo.module';


@Module({
  imports: [
    TypeOrmModule.forRoot({
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: 'root',
        database: 'test',
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        synchronize: true,
      }),
      PhotoModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

為方便,這里直接用安裝typeorm時生成的photo文件demo從數據庫中進行增刪改查,使用時先將photo.module.ts在app.module.ts中先注冊下。

photo.controller.ts內容如下

import { Controller, Get, Post, Param, Body } from '@nestjs/common';
import { PhotoService } from './photo.service';
import { Photo } from './photo.entity';

@Controller()
export class PhotoController {
  constructor(private readonly photoService: PhotoService) {}

  @Get('photo')
  findAll(): Promise<Photo[]> {
    return this.photoService.findAll();
  }

  @Post('photo/create')
  create(@Body() params) {
      return this.photoService.create(params);
  }
}

photo.service.ts內容如下:

import { Injectable, Inject } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Photo } from './photo.entity';

@Injectable()
export class PhotoService {
  constructor(
    @InjectRepository(Photo)
    private readonly photoRepository: Repository<Photo>,
  ) {}

  async findAll(): Promise<Photo[]> {
    return await this.photoRepository.find();
  }

  async create(params) {
   // 增加一條數據 let photo
= new Photo(); photo.name = params.name; photo.description = params.description; photo.filename = params.filename; photo.views = params.views; photo.isPublished = params.isPublished; return this.photoRepository.save(photo) .then(res => { return this.findAll(); }) .catch(err => { return err; }) } }

然后打開postman工具模擬post請求:

可以看到成功插入並返回數據,去數據庫中再看下:

其他更新,刪除操作也同理。。。

基本入門完畢~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM