การพัฒนา 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
Guards
การทำงานจะคล้ายกับ Middleware แต่จะมีการกำหนดการเข้าใช้งาน role
ทุกคนที่มีความสนใจในเรื่องของ Nest js สามารถไปอ่าน Doc เพิ่มเติมได้ https://docs.nestjs.com/ และไว้ว่าทุกคนจะสนุกกับการเขียน nest js นะครับ