Nest Js ทำความรู้จักแล้วใช้งานกันเถอะ

og:image

การพัฒนา RESTful Api มีเครื่องมือแหละภาษามากมายและต่างละภาษาจะมีวิธีการพัฒนาที่แตกต่างกันซึ่งแต่ละภาษาจะมี Framework  ในการช่วยพัฒนา RESTful Api ของแต่ละภาษาเช่นเดียวกับ Nest js ก็เป็น Framework  ของ js (javascript) แต่เราสามารถใช้ tysciprt ในการพัฒนาได้วันนี้เราจะมาทำความเข้าใจกัน

Nest JS คือ Framework สำหรับการสร้าง Application ฝั่ง Server โดยใช้ Node.js แนวคิดในการพัฒนาจะเป็นเชิง OOP ที่สมบูรณ์ โครงสร้างโค้ดและเขียนโค้ดได้อย่างมีระบบ มีรูปแบบในการพัฒนาที่ชัดเจนยิ่งขึ้น และยังสามารถทำงานควบคู่กับ Library อื่นๆได้อีกมากมาย เช่น Express.js หรือ Socket.io หรือ Libary อื่นๆ อีกมากมาย

การติดตั้ง NestJs

npm i -g @nestjs/cli
nest new project-name

โครงสร้างเบื้องต้น

โครงสร้างไฟล์

ลองรัน Project

npm run start 
ดูผลได้ที่ http://localhost:3000

main.ts 

เป็นไฟล์เริ่มต้นของโปรเจ็ค เป็นไฟล์ Run app โดย Default ของมันจะใช้ Express ซึ่งเราก็ยังสามารถ Fastify

รายละเอียดการใช้งานที่ต้องรู้

Modules
มีหน้าที่รวบรวม ครอบคลุมส่วนประกอบหลักต่างๆ ซึ่งประกอบด้วย Controller และ Service โดยที่เราสามารถสร้างได้หลายๆ Module แล้วเอามารวมกันก็ได้

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController], //<== Controller
  providers: [CatsService],//<== Service 
})
export class CatsModule {}

Nest CLI หรือ สำหรับการสร้าง ใช้ สร้าง module

nest generate module #pathName #moduleNameหรือ
nest g m #pathName #moduleName

  Controllers

มีหน้าที่จัดการ Request จาก Client และทำหน้าที่ ส่ง data ไปให้ Client โดยที่วิธีเรียก เรียกใช้ผ่าน Route ต่างๆ เช่น /users, /product

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

@Controller('cats') //<== ชื่อ controller หลัก
export class CatsController {
  @Get()  //<==  Method  controller   
  findAll(): string { //<==  controller  ย่อยบ
    return 'This action returns all cats';
  }
}

Method Contrller สามาใช้ได้

@Get()
@Put()
@Post()
@Delete()

ตัวอย่างการใช้ อื่นๆ

import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';

@Controller('cats')
export class CatsController {
  @Post()
  create(@Body() createCatDto: CreateCatDto) {
    return 'This action adds a new cat';
  }

  @Get()
  findAll(@Query() query: ListAllEntities) {
    return `This action returns all cats (limit: ${query.limit} items)`;
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return `This action returns a #${id} cat`;
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return `This action updates a #${id} cat`;
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return `This action removes a #${id} cat`;
  }
}

Nest CLI หรือ สำหรับการสร้าง ใช้ สร้าง Controller

nest generate controller #pathName #coName
หรือ
nest g co #pathName #coName

Providers / Services

Class ที่ประกาศเป็น @Injectable() เป็นการบอกว่าสามารถเอาสิ่งไปใช้กับ อะไรก็ได้

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}

Nest CLI หรือ สำหรับการสร้าง ใช้ สร้าง Providers / Services

nest generate service #pathName #serviceName
หรือ
nest g s #pathName #serviceName

Middleware

เมื่อมี Request ใดๆเข้ามาที่มี middleware อยู่จะทำงานก่อนเข้า conotrller

Middleware

Guards

การทำงานจะคล้ายกับ Middleware แต่จะมีการกำหนดการเข้าใช้งาน role

Guards

ทุกคนที่มีความสนใจในเรื่องของ Nest js สามารถไปอ่าน Doc เพิ่มเติมได้ https://docs.nestjs.com/ และไว้ว่าทุกคนจะสนุกกับการเขียน nest js นะครับ