คอนเทนเนอร์· ~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 multerconst 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'))# 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ห่อเป็น 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"]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สรุป Key Takeaways
- สร้างระบบทีละชั้น ทดสอบให้ผ่านก่อนต่อชั้นถัดไป — พังจะได้รู้ว่าพังชั้นไหน
- multer รับไฟล์ multipart · videoId สุ่มใหม่ต่อการอัปโหลด ใช้เป็นชื่อโฟลเดอร์ตลอด pipeline
- /healthz เตรียมไว้ให้ K8s probe ใช้ในบทถัดไป
อ่านจบแล้วอย่าลืมทำเครื่องหมาย

