สร้างและรันโปรเจกต์ NestJS บน macOS ด้วย ServBay
NestJS คือเฟรมเวิร์ก Node.js เชิงโปรเกรสซีฟสำหรับสร้างแอปพลิเคชันฝั่งเซิร์ฟเวอร์ที่มีประสิทธิภาพและสามารถขยายขนาดได้ เขียนด้วย TypeScript และได้รับแรงบันดาลใจจาก Angular โดยมีสถาปัตยกรรมแบบแยกโมดูล (Modular) และระบบ Dependency Injection (DI) NestJS มอบเครื่องมือและฟีเจอร์ทรงพลังที่ช่วยให้คุณพัฒนาแอปพลิเคชันที่ดูแลรักษา ทดสอบ และขยายได้ง่ายขึ้น
คุณสมบัติเด่นและข้อดีของ NestJS
- สถาปัตยกรรมแบบโมดูล: จัดระเบียบโค้ดด้วยโมดูล ทำให้แอปฯ มีโครงสร้างชัดเจน เข้าใจง่าย และดูแลรักษาสะดวก
- Dependency Injection: มีระบบ DI ที่ทรงพลังและใช้งานง่าย เพิ่มความสามารถในการทดสอบและดูแลรักษาโค้ด
- ใช้ TypeScript: ใช้ประโยชน์จากการตรวจสอบชนิดข้อมูลแบบ Static, อินเทอร์เฟส และความสามารถของ JavaScript สมัยใหม่ เพิ่มประสิทธิภาพการพัฒนา คุณภาพโค้ด และลดข้อผิดพลาดรันไทม์
- Decorator มากมาย: นิยาม Controller, Service, Module ฯลฯ ด้วย Decorator ทำให้โค้ดสั้น สื่อความหมาย และชัดเจน
- ระบบนิเวศสมบูรณ์: มีคอมมูนิตี้แอคทีฟ, โมดูล/ปลั๊กอินเสริมมากมาย เช่น TypeORM, Mongoose, GraphQL, WebSockets, Cache, การตรวจสอบข้อมูล ฯลฯ
- ยึดมาตรฐาน: สร้างบน Express หรือ Fastify ซึ่งเป็น HTTP Server Framework ยอดนิยม ให้ทั้งความเข้ากันได้และประสิทธิภาพ
การใช้ NestJS ช่วยให้คุณพัฒนาแอปพลิเคชัน Web, API, หรือ Microservices คุณภาพสูงตามแนวปฏิบัติที่ดีของฝั่ง Backend (เช่น SOLID, Design Patterns) ได้อย่างรวดเร็ว
สร้างและรันโปรเจกต์ NestJS ด้วย ServBay
ServBay สำหรับ macOS คือสภาพแวดล้อมนักพัฒนาเว็บออลอินวัน ที่บูรณาการ Node.js หลายเวอร์ชัน ฐานข้อมูลยอดนิยม และเว็บเซิร์ฟเวอร์ ในบทความนี้เราจะใช้ Node.js ที่ติดตั้งมากับ ServBay และฟีเจอร์ “เว็บไซต์” เพื่อสร้าง รัน และตั้งค่าโปรเจกต์ NestJS โดยจะใช้ Reverse Proxy ของ ServBay ให้คุณเข้าถึงแอปพลิเคชัน NestJS ผ่านโดเมนเนมของคุณเองในเครื่อง
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น โปรดตรวจสอบว่า
- ติดตั้ง ServBay แล้ว: คุณได้ติดตั้ง ServBay บน macOS เรียบร้อย
- เปิดใช้งาน Node.js Package: ที่แท็บ ‘แพ็คเกจ (Packages)’ ใน ServBay Control Panel ให้เลือกและติดตั้งเวอร์ชัน Node.js ที่ต้องการ หากยังไม่ได้เปิด Node.js อ่านคู่มือ การใช้งาน ServBay Node.js
สร้างโปรเจกต์ NestJS
ติดตั้ง NestJS CLI แบบ Global
เปิด Terminal แล้วใช้ npm (มากับ Node.js) ติดตั้งเครื่องมือ CLI ของ NestJS ทั่วเครื่อง:
bashnpm install -g @nestjs/cli
1เริ่มต้นโปรเจกต์
เปลี่ยน Directory ไปที่โฟลเดอร์รากของเว็บไซต์ที่ ServBay แนะนำ
/Applications/ServBay/www
โฟลเดอร์นี้เก็บเว็บไซต์ตามค่าดีฟอลต์ของ ServBay ให้อยู่ในนี้เพื่อสะดวกต่อการตั้งค่าเว็บไซต์ แล้วสร้างโปรเจกต์ใหม่ด้วย CLI ดังนี้:bashcd /Applications/ServBay/www nest new servbay-nest-app
1
2หลังสั่งคำสั่ง CLI จะถามรายละเอียด เช่น เลือกแพ็คเกจแมเนเจอร์ (npm, yarn หรือ pnpm) แนะนำให้เลือก npm เพื่อความสะดวก โปรเจกต์จะถูกสร้างที่
/Applications/ServBay/www/servbay-nest-app
ติดตั้ง Dependency ของโปรเจกต์
เข้าไปที่โฟลเดอร์โปรเจกต์
servbay-nest-app
และติดตั้ง Dependency ที่จำเป็นทั้งหมด:bashcd servbay-nest-app npm install
1
2ปกติ
nest new
จะรันnpm install
ให้อยู่แล้ว แต่นี่เพื่อความมั่นใจว่าทุก Dependency ถูกติดตั้งและอัปเดตเรียบร้อย
แก้ไข Output ของโปรเจกต์ NestJS (ไม่บังคับ)
เพื่อเช็คว่าทุกอย่างรันถูกต้องและเข้าถึงผ่าน ServBay ได้ แนะนำให้แก้ไข Response ของ Root Route
แก้ไขไฟล์
src/app.controller.ts
เปิดไฟล์
src/app.controller.ts
ด้วย Editor ที่คุณถนัด แล้วเปลี่ยนเนื้อหาให้เมื่อเข้าผ่าน Root Path (/
) จะตอบกลับเป็นข้อความว่า "Hello ServBay!":typescriptimport { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; // สมมุติว่าคุณเก็บ AppService ไว้ @Controller() export class AppController { constructor(private readonly appService: AppService) {} // หากใช้ AppService @Get() getHello(): string { // return this.appService.getHello(); // หากใช้ AppService return 'Hello ServBay!'; // ตอบกลับข้อความตรง ๆ } }
1
2
3
4
5
6
7
8
9
10
11
12
13ตัวอย่างข้างบนนี้จะสร้าง Controller ง่าย ๆ สำหรับ HTTP GET ไปยัง Root Path (
/
) และตอบกลับ String ที่ระบุ
รันโปรเจกต์ NestJS ในโหมดพัฒนาและเข้าถึงผ่าน ServBay
โดยปกติการพัฒนา NestJS จะใช้ Server ที่รันในตัวและฟังค์ Port หนึ่ง แล้วจึงใช้ฟีเจอร์ “เว็บไซต์” ของ ServBay สร้าง Reverse Proxy ให้ชี้ไปพอร์ตนี้ผ่านโดเมนที่ตั้งเอง
รัน Development Server
อยู่ที่โฟลเดอร์
/Applications/ServBay/www/servbay-nest-app
แล้วสั่งรัน Development Server ด้วยการตั้งค่าPORT
เช่น8585
bashcd /Applications/ServBay/www/servbay-nest-app PORT=8585 npm run start:dev
1
2สคริปต์
npm run start:dev
คือคำสั่งมาตรฐานของ NestJS โปรเจกต์ ใช้ts-node
รัน TypeScript และ watch ไฟล์ให้ Restart Server อัตโนมัติ หากโปรเจกต์รันสำเร็จจะฟังค์ที่localhost:8585
ตั้งค่าเว็บไซต์ Reverse Proxy ใน ServBay
ที่ ServBay Control Panel ไปที่แท็บ ‘เว็บไซต์ (Websites)’ แล้วกดปุ่มเพิ่ม (ไอคอน
+
) เพื่อสร้างเว็บไซต์ใหม่:- ชื่อ (Name): ตั้งชื่อจำง่ายเช่น
My first NestJS dev site
- โดเมน (Domains): ใส่โดเมนที่ต้องการ (เช่น
servbay-nest-test.dev
) ServBay จะ Map.dev
ไปที่เครื่องอัตโนมัติ ไม่ต้องแก้ hosts - ประเภท (Type): เลือก
Reverse Proxy
- IP Address: ใส่ IP ที่ Server Node.js ฟังค์อยู่คือ
127.0.0.1
- Port: พอร์ตของ NestJS ที่ตั้งไว้เมื่อครู่ เช่น
8585
กดบันทึก ServBay จะปรับการตั้งค่า Web Server (Caddy หรือ Nginx) ให้อัตโนมัติ รายละเอียดเพิ่มเติมดูที่ คู่มือเพิ่มเว็บไซต์ใน ServBay
- ชื่อ (Name): ตั้งชื่อจำง่ายเช่น
เข้าถึงเว็บไซต์ Development ผ่านเบราเซอร์
เปิดเบราเซอร์และเข้าไปที่
https://servbay-nest-test.dev
หมายเหตุ:
- ServBay จะออกใบรับรอง SSL ฟรี (โดย ServBay User CA) ให้เว็บไซต์ในเครื่องที่ตั้งผ่าน ServBay ทุกเว็บ คุณจึงเข้าผ่าน
https
ได้ หากมีแจ้งเตือนใบรับรอง ให้ไว้ใจ CA ตามขั้นตอนใน คู่มือใช้ SSL กับเว็บไซต์ - ตรวจสอบว่า Development Server ของ NestJS (
PORT=8585 npm run start:dev
) กำลังเปิดอยู่ หากปิด การเข้าผ่านโดเมนจะไม่สำเร็จ
- ServBay จะออกใบรับรอง SSL ฟรี (โดย ServBay User CA) ให้เว็บไซต์ในเครื่องที่ตั้งผ่าน ServBay ทุกเว็บ คุณจึงเข้าผ่าน
ติดตั้งแอปในโหมด Production และเข้าถึงผ่าน ServBay
ก่อนนำแอป NestJS ไปใช้งานจริง (หรือจำลอง Production บนเครื่อง) ต้อง Build โปรเจกต์ก่อน
Build โปรเจกต์สำหรับ Production
ที่โฟลเดอร์
/Applications/ServBay/www/servbay-nest-app
สั่ง Build:bashcd /Applications/ServBay/www/servbay-nest-app npm run build
1
2คำสั่งนี้จะ Compile โค้ด TypeScript ไปไว้ที่โฟลเดอร์
dist
รัน Production Server
เมื่อ Build เสร็จ สั่งรัน Production โดยใช้ Node.js รันไฟล์ JS ที่ Compile แล้ว และตั้ง
PORT
เช่น8586
กับNODE_ENV=production
bashcd /Applications/ServBay/www/servbay-nest-app PORT=8586 NODE_ENV=production node dist/main.js
1
2โหมด Production จะไม่มี Watch หรือ Hot Reload
ตั้งค่าเว็บไซต์ Reverse Proxy สำหรับ Production
กลับไปที่แท็บ ‘เว็บไซต์’ ของ ServBay เพิ่มหรือแก้ไขเว็บไซต์ใหม่สำหรับ Production:
- ชื่อ (Name): เช่น
My first NestJS production site
- โดเมน (Domains): เช่น
servbay-nest-test.prod
- ประเภท (Type):
Reverse Proxy
- IP Address:
127.0.0.1
- Port:
8586
(ต้องตรงกับที่ Server ฟังค์)
บันทึกการตั้งค่า
- ชื่อ (Name): เช่น
เข้าถึง Production Website
เปิดเบราเซอร์ และเยี่ยมชม
https://servbay-nest-test.prod
เพื่อดูแอป NestJS ในโหมด Production พร้อมข่าวดีว่าได้ SSL ด้วย
เชื่อมต่อฐานข้อมูลของ ServBay
ServBay มาพร้อมฐานข้อมูลหลากหลายรองรับ เช่น MariaDB (เข้ากันกับ MySQL), PostgreSQL, MongoDB, Redis สำหรับโปรเจกต์ NestJS คุณสามารถเชื่อมต่อใช้งานฐานข้อมูลเหล่านี้ได้อย่างง่ายดาย
ข้อควรระวัง: ก่อนเชื่อมต่อกับฐานข้อมูล ต้องเปิดแพ็คเกจฐานข้อมูลที่ต้องการให้ทำงานก่อนที่แท็บ ‘Packages’ ใน ServBay Control Panel สามารถดูรายละเอียดพอร์ต, ชื่อผู้ใช้, รหัสผ่าน ฯลฯ ได้จากแผงควบคุมหรือคู่มือประกอบ สำหรับ Production แนะนำให้เปลี่ยนอัตราส่วน Default Credential และสร้าง User ใหม่
ตัวอย่างโค้ดเชื่อมต่อฐานข้อมูลยอดนิยมใน NestJS (ไว้ใน AppModule หรือโมดูลฐานข้อมูล)
เชื่อมต่อ MongoDB
ติดตั้งแพ็คเกจสำหรับใช้ MongoDB กับ NestJS:
bashnpm install @nestjs/mongoose mongoose
1ตั้งค่าการเชื่อมต่อในโมดูล:
typescriptimport { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; // ... import อื่น ๆ @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost:27017/servbay-nest-app'), // พอร์ตดีฟอลต์ 27017 // ... โมดูลอื่น ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13ค่า Connection String ที่ใช้กับ ServBay มาตรฐานคือ
mongodb://localhost:27017/
อาจต้องใช้ MongoDB Compass หรือmongosh
ในการสร้างฐานข้อมูลservbay-nest-app
ก่อนเชื่อมต่อ Redis
ติดตั้งแพ็คเกจที่จำเป็นสำหรับ Redis:
bashnpm install @nestjs/redis redis @types/redis
1ตั้งค่าการเชื่อมต่อ Redis ในโมดูล:
typescriptimport { Module } from '@nestjs/common'; import { RedisModule } from '@nestjs/redis'; // ... import อื่น ๆ @Module({ imports: [ RedisModule.forRoot({ url: 'redis://localhost:6379', // พอร์ตดีฟอลต์ 6379 }), // ... โมดูลอื่น ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Redis Server ใน ServBay ใช้
localhost:6379
เป็นดีฟอลต์เชื่อมต่อ MariaDB (MySQL Compatible)
ติดตั้งแพ็คเกจสำหรับใช้งานกับ TypeORM และ MariaDB/MySQL:
bashnpm install @nestjs/typeorm mysql2 typeorm
1ตั้งค่า TypeOrmModule ในโมดูลของคุณ:
typescriptimport { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; // ... import อื่น ๆ @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mariadb', // หรือ 'mysql' host: 'localhost', port: 3306, // พอร์ต 3306 username: 'root', // ผู้ใช้ดีฟอลต์ของ ServBay MariaDB/MySQL password: 'password', // รหัสผ่านดีฟอลต์ของ ServBay MariaDB/MySQL database: 'servbay_nest_app', // ต้องสร้าง database ก่อน entities: [], // Entity ของคุณ synchronize: true, // สำหรับ Dev ให้เป็น true, Production ไม่ควร }), // ... โมดูลอื่น ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22หมายเหตุ: MariaDB/MySQL ใน ServBay ใช้ผู้ใช้
root
กับรหัสผ่านpassword
คุณต้องใช้ Database Client (เช่น TablePlus, DBeaver หรือ MySQL CLI) เชื่อมต่อที่localhost:3306
และสร้างฐานข้อมูลservbay_nest_app
ด้วยตนเอง ด้านความปลอดภัยแนะนำเปลี่ยนรหัสและสร้าง User ใหม่ พร้อมจำกัดสิทธิ์เชื่อมต่อ PostgreSQL
ติดตั้งแพ็คเกจสำหรับ PostgreSQL:
bashnpm install @nestjs/typeorm pg typeorm
1ตั้งค่า TypeOrmModule สำหรับ PostgreSQL:
typescriptimport { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; // ... import อื่น ๆ @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, // พอร์ต 5432 username: 'servbay', // ผู้ใช้ดีฟอลต์ของ ServBay PostgreSQL (ตรวจสอบจริงอีกครั้ง) password: 'password', // รหัสผ่านตัวอย่าง (ตรวจสอบจริงอีกครั้ง) database: 'servbay_nest_app', // ต้องสร้าง database ก่อน entities: [], // Entity ของคุณ synchronize: true, // สำหรับ Dev ให้เป็น true, Production ไม่ควร }), // ... โมดูลอื่น ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22หมายเหตุ: ชื่อผู้ใช้และรหัสผ่านของ ServBay PostgreSQL อาจแตกต่างกันตามเวอร์ชัน นิยมใช้
servbay
หรือpostgres
ให้ตรวจสอบใน Control Panel หรือเอกสาร ServBay และใช้ PostgreSQL Client เชื่อมต่อlocalhost:5432
สร้างฐานข้อมูล/ผู้ใช้ใหม่ ถ้าเป็น Production ควรเปลี่ยน Credentials ทุกครั้ง
สรุป
ผ่านบทความนี้ คุณได้เรียนรู้วิธีสร้าง รัน และเข้าถึงโปรเจกต์ NestJS บน macOS ด้วย ServBay ได้อย่างรวดเร็ว สภาพแวดล้อม Node.js ที่ครบครัน ฟีเจอร์ตั้งค่าเว็บไซต์อัตโนมัติ (Reverse Proxy) และฐานข้อมูลในตัวของ ServBay ช่วยให้คุณพัฒนาทดสอบ NestJS ในเครื่องและสลับ Dev/Production ได้สะดวก พร้อมเข้าถึงเว็บแอปด้วยโดเมนของคุณเองผ่าน HTTPS และเชื่อมต่อฐานข้อมูลได้อย่างง่ายดาย