171 lines
9.0 KiB
Plaintext
171 lines
9.0 KiB
Plaintext
|
|
# การติดตั้งและสร้างโปรเจกต์ (Project Initialization)
|
|
|
|
1. ข้อกำหนดเบื้องต้น (Prerequisites)
|
|
ก่อนเริ่ม, ตรวจสอบให้แน่ใจว่าคุณมีเครื่องมือเหล่านี้ติดตั้งบน Windows 11 ของคุณแล้ว:
|
|
Node.js: เวอร์ชัน 18.x หรือสูงกว่า
|
|
NPM หรือ Yarn: ตัวจัดการ Package (มักจะมาพร้อมกับ Node.js)
|
|
NestJS CLI: เครื่องมือ Command-line สำหรับ NestJS
|
|
หากยังไม่ได้ติดตั้ง NestJS CLI, ให้เปิด VS Code Terminal หรือ Command Prompt แล้วรันคำสั่ง:
|
|
|
|
bash
|
|
npm install -g @nestjs/cli
|
|
|
|
## 2.1 สร้างโปรเจกต์ NestJS ใหม่
|
|
ไปที่ Directory ที่คุณต้องการเก็บโปรเจกต์ (เช่น C:\Users\YourUser\Development\)
|
|
ใช้ NestJS CLI เพื่อสร้างโปรเจกต์ใหม่ ผมจะตั้งชื่อว่า backend-np-dms นะครับ:
|
|
|
|
Bash
|
|
nest new backend
|
|
|
|
ระบบจะถามว่าต้องการใช้ Package Manager ตัวไหน แนะนำให้เลือก npm, รอจนกว่ากระบวนการจะเสร็จสิ้น คุณจะได้โฟลเดอร์ backend ที่มีโครงสร้างพื้นฐานของ NestJS พร้อมใช้งาน
|
|
|
|
## 2.2 ติดตั้ง Dependencies ที่จำเป็น
|
|
ตอนนี้เราจะติดตั้ง Modules ทั้งหมดที่คุณวางแผนไว้ในคราวเดียว เพื่อให้โปรเจกต์พร้อมสำหรับการพัฒนา
|
|
|
|
เปิด Terminal ใน VS Code ภายในโฟลเดอร์ backend (cd backend) แล้วรันคำสั่งต่อไปนี้:
|
|
|
|
* Database & ORM (TypeORM for MariaDB/MySQL)
|
|
Bash
|
|
npm install @nestjs/typeorm typeorm mysql2
|
|
|
|
* Configuration Management (สำหรับ .env)
|
|
npm install @nestjs/config
|
|
|
|
* API Documentation
|
|
npm install @nestjs/swagger
|
|
|
|
* Validation & Transformation
|
|
npm install class-validator class-transformer
|
|
|
|
* Security
|
|
npm install helmet
|
|
|
|
* Authentication (JWT)
|
|
npm install @nestjs/passport passport passport-jwt @nestjs/jwt
|
|
npm install --save-dev @types/passport-jwt
|
|
|
|
คำอธิบาย:
|
|
@nestjs/typeorm typeorm mysql2: สำหรับเชื่อมต่อและจัดการฐานข้อมูล MariaDB
|
|
@nestjs/config: สำหรับจัดการ Environment Variables (เช่น ข้อมูลการเชื่อมต่อ DB) ผ่านไฟล์ .env
|
|
@nestjs/swagger: สำหรับสร้างหน้าเอกสาร API (Swagger/OpenAPI) โดยอัตโนมัติ
|
|
class-validator class-transformer: ใช้สำหรับตรวจสอบความถูกต้องของข้อมูลที่ส่งเข้ามาใน API (Request Body Validation)
|
|
helmet: ช่วยเพิ่มความปลอดภัยพื้นฐานโดยการตั้งค่า HTTP Headers ที่เหมาะสม
|
|
@nestjs/passport, @nestjs/jwt: เครื่องมือมาตรฐานสำหรับทำระบบ Authentication
|
|
|
|
## 2.3: ตั้งค่าพื้นฐานในโปรเจกต์ (Initial Configuration)
|
|
ตอนนี้เราจะแก้ไขไฟล์หลักๆ เพื่อเปิดใช้งาน Modules ที่ติดตั้งไป
|
|
|
|
1. สร้างไฟล์ Environment (.env)
|
|
ที่ราก (root) ของโปรเจกต์ backend-np-dms, สร้างไฟล์ใหม่ชื่อ .env และใส่ข้อมูลการเชื่อมต่อฐานข้อมูลของคุณ (ข้อมูลนี้จะไม่ถูกเก็บใน Git):
|
|
|
|
.env
|
|
|
|
Code snippet
|
|
|
|
* Database Configuration
|
|
DB_TYPE=mysql
|
|
DB_HOST=localhost
|
|
DB_PORT=3306
|
|
DB_USERNAME=your_db_user # <-- แก้ไขเป็น user ของคุณ
|
|
DB_PASSWORD=your_db_password # <-- แก้ไขเป็น password ของคุณ
|
|
DB_DATABASE=dms_db # <-- แก้ไขเป็นชื่อ database ของคุณ
|
|
|
|
* Application
|
|
API_PORT=3001
|
|
💡 Tip: หากคุณรัน MariaDB ผ่าน Docker, DB_HOST อาจจะเป็นชื่อ Service ของ Docker container (เช่น mariadb-container) หรือ IP ของ QNAP ของคุณ
|
|
|
|
2. แก้ไข app.module.ts เพื่อเชื่อมต่อ Database และ Config
|
|
เปิดไฟล์ src/app.module.ts และแก้ไขให้เป็นตามนี้เพื่อ import ConfigModule และ TypeOrmModule:
|
|
|
|
src/app.module.ts
|
|
|
|
```TypeScript
|
|
|
|
import { Module } from '@nestjs/common';
|
|
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
import { AppController } from './app.controller';
|
|
import { AppService } from './app.service';
|
|
|
|
@Module({
|
|
imports: [
|
|
// 1. Config Module - สำหรับอ่าน .env (ต้องอยู่บนสุด)
|
|
ConfigModule.forRoot({
|
|
isGlobal: true, // ทำให้ ConfigService พร้อมใช้งานทั่วทั้งแอป
|
|
envFilePath: '.env',
|
|
}),
|
|
|
|
// 2. TypeORM Module - สำหรับเชื่อมต่อ Database
|
|
TypeOrmModule.forRootAsync({
|
|
imports: [ConfigModule],
|
|
inject: [ConfigService],
|
|
useFactory: (configService: ConfigService) => ({
|
|
type: 'mysql',
|
|
host: configService.get<string>('DB_HOST'),
|
|
port: configService.get<int>('DB_PORT'),
|
|
username: configService.get<string>('DB_USERNAME'),
|
|
password: configService.get<string>('DB_PASSWORD'),
|
|
database: configService.get<string>('DB_DATABASE'),
|
|
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
|
|
synchronize: true, // สำหรับ Development เท่านั้น! จะสร้างตารางให้อัตโนมัติ
|
|
logging: true,
|
|
}),
|
|
}),
|
|
],
|
|
controllers: [AppController],
|
|
providers: [AppService],
|
|
})
|
|
export class AppModule {}
|
|
```
|
|
⚠️ คำเตือน: synchronize: true สะดวกมากในช่วงพัฒนาเพราะมันจะปรับโครงสร้างตารางตาม Entity ให้อัตโนมัติ ห้ามใช้ใน Production เด็ดขาด เพราะอาจทำให้ข้อมูลหายได้ ใน Production ควรใช้ระบบ Migration แทน
|
|
|
|
3. แก้ไข main.ts เพื่อเปิดใช้งาน Swagger, Validation และ Security
|
|
เปิดไฟล์ src/main.ts และเพิ่มการตั้งค่าต่างๆ เข้าไป:
|
|
|
|
src/main.ts
|
|
|
|
TypeScript
|
|
|
|
import { NestFactory } from '@nestjs/core';
|
|
import { AppModule } from './app.module';
|
|
import { ValidationPipe } from '@nestjs/common';
|
|
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
|
|
import helmet from 'helmet';
|
|
|
|
async function bootstrap() {
|
|
const app = await NestFactory.create(AppModule);
|
|
|
|
// เปิดใช้งาน CORS (Cross-Origin Resource Sharing)
|
|
app.enableCors();
|
|
|
|
// เพิ่ม Helmet เพื่อความปลอดภัย
|
|
app.use(helmet());
|
|
|
|
// ตั้งค่า Global Validation Pipe
|
|
app.useGlobalPipes(new ValidationPipe({
|
|
whitelist: true, // ตัด property ที่ไม่มีใน DTO ออก
|
|
transform: true, // แปลงข้อมูลให้เป็น type ที่ระบุใน DTO
|
|
}));
|
|
|
|
// ตั้งค่า Swagger API Documentation
|
|
const config = new DocumentBuilder()
|
|
.setTitle('LCBP3-DMS API')
|
|
.setDescription('The Document Management System API for LCBP3 Project')
|
|
.setVersion('1.0')
|
|
.addBearerAuth() // สำหรับ JWT
|
|
.build();
|
|
const document = SwaggerModule.createDocument(app, config);
|
|
SwaggerModule.setup('api-docs', app, document); // เข้าถึงได้ที่ /api-docs
|
|
|
|
// เริ่มรัน Server
|
|
const port = process.env.API_PORT || 3001;
|
|
await app.listen(port);
|
|
console.log(`Application is running on: ${await app.getUrl()}`);
|
|
}
|
|
bootstrap();
|
|
|
|
curl -i -X POST \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"username": "superadmin", "password": "Center#2025"}' \
|
|
https://backend.np-dms.work/api/auth/login |