ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~30 นาที

สร้าง Upload API ด้วย Node.js + Docker

เขียน API รับอัปโหลดไฟล์วิดีโอ ทดสอบด้วย curl แล้วห่อเป็น container

พื้นฐานที่ควรรู้: ประตูทางเข้าของระบบคือ API ที่รับไฟล์วิดีโอจากผู้ใช้ บทนี้เราเขียนเวอร์ชันแรกแบบง่ายที่สุด (รับไฟล์ → ตอบ videoId กลับ) ทดสอบให้ผ่านก่อน แล้วค่อยต่อ MinIO กับ K8s Job ในบทถัด ๆ ไป — ทำทีละชั้นแบบนี้ เวลาพังจะรู้ทันทีว่าพังชั้นไหน

cd ~/projects/k8s-video-pipeline/api
npm init -y
npm install express multer
💻 ตั้งโปรเจกต์ Node.js
const express = require('express')
const multer = require('multer')
const crypto = require('crypto')

const app = express()
const upload = multer({
  dest: '/tmp/uploads',
  limits: { fileSize: 500 * 1024 * 1024 }, // จำกัด 500 MB
})

app.post('/api/upload', upload.single('video'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ error: 'ต้องแนบไฟล์ใน field ชื่อ "video"' })
  }
  const videoId = crypto.randomUUID().slice(0, 8)
  console.log('ได้รับไฟล์', req.file.originalname, req.file.size, 'bytes → videoId =', videoId)
  res.json({ videoId, status: 'received' })
})

app.get('/healthz', (_req, res) => res.send('ok'))

app.use(express.static('public')) // หน้าเว็บ (จะเติมในบท 8.7)

app.listen(3000, () => console.log('Upload API ฟังที่พอร์ต 3000'))
📄 api/server.js — เวอร์ชัน 1: รับไฟล์อย่างเดียว
# terminal 1
node server.js

# terminal 2 — อัปโหลดไฟล์ทดสอบจากบทที่แล้ว
curl -F "video=@../sample.mp4" http://localhost:3000/api/upload
# → {"videoId":"a1b2c3d4","status":"received"}

curl http://localhost:3000/healthz   # → ok
💻 รันแล้วทดสอบด้วย curl (เปิด 2 terminal)

ห่อเป็น Docker image

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY server.js ./
COPY public ./public
EXPOSE 3000
CMD ["node", "server.js"]
📄 api/Dockerfile
cd ~/projects/k8s-video-pipeline/api
mkdir -p public && touch public/.gitkeep
docker build -t video-api:v1 .
docker run --rm -p 3000:3000 video-api:v1

# terminal อื่น — ต้องได้ผลเหมือนตอนรันด้วย node ตรง ๆ
curl -F "video=@../sample.mp4" http://localhost:3000/api/upload
💻 สร้าง public ว่าง ๆ ไว้ก่อน แล้ว build + ทดสอบรันจาก image (รันในโฟลเดอร์ api/ — จุด "." ท้ายคำสั่ง build คือ build context ต้องเป็นที่ที่ Dockerfile อยู่)

สรุป Key Takeaways

  • สร้างระบบทีละชั้น ทดสอบให้ผ่านก่อนต่อชั้นถัดไป — พังจะได้รู้ว่าพังชั้นไหน
  • multer รับไฟล์ multipart · videoId สุ่มใหม่ต่อการอัปโหลด ใช้เป็นชื่อโฟลเดอร์ตลอด pipeline
  • /healthz เตรียมไว้ให้ K8s probe ใช้ในบทถัดไป
อ่านจบแล้วอย่าลืมทำเครื่องหมาย