Bài này đưa ứng dụng Node.js tới mức sẵn sàng vận hành: viết kiểm thử tự động cho API bằng node:test và supertest, thêm tính năng thời gian thực bằng Socket.IO, và triển khai lên máy chủ hoặc dịch vụ đám mây với PM2, Docker.
- Viết unit test và test API
- Thêm thông báo thời gian thực với Socket.IO
- Chạy ứng dụng ổn định bằng PM2
- Đóng gói Docker, triển khai lên Render/Railway/VPS
Một số khái niệm
Ứng dụng thật cần: kiểm thử để sửa mã không sợ hỏng; ghi log và giám sát; khởi động lại tự động khi lỗi; biến môi trường riêng cho từng nơi chạy (máy bạn, máy chủ thử, máy chủ thật).
Kiểm thử
npm install -D supertest// test/sinhvien.test.js
import { test, describe } from 'node:test';
import assert from 'node:assert/strict';
import request from 'supertest';
import app from '../src/app.js'; // tách app khỏi app.listen để test
describe('API sinh viên', () => {
test('GET /api/sinhvien trả danh sách', async () => {
const res = await request(app).get('/api/sinhvien').set('Authorization', 'Bearer ' + process.env.TEST_TOKEN);
assert.equal(res.status, 200);
assert.ok(Array.isArray(res.body.du_lieu));
});
test('POST thiếu dữ liệu trả 422', async () => {
const res = await request(app).post('/api/sinhvien').send({}).set('Authorization', 'Bearer ' + process.env.TEST_TOKEN);
assert.equal(res.status, 422);
});
});node --test --env-file=.env.testThời gian thực với Socket.IO
npm install socket.io// server.js
import { createServer } from 'node:http';
import { Server } from 'socket.io';
import app from './src/app.js';
const server = createServer(app);
const io = new Server(server, { cors: { origin: 'http://localhost:5173' } });
io.on('connection', socket => {
socket.on('tin-nhan', msg => io.emit('tin-nhan', { msg, luc: Date.now() })); // phát cho mọi người
});
app.set('io', io); // trong route: req.app.get('io').emit('diem-moi', {...})
server.listen(3000);<!-- client -->
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
socket.on('tin-nhan', d => console.log(d.msg));
socket.emit('tin-nhan', 'Xin chào lớp K66!');
</script>Triển khai
# PM2 trên VPS (Ubuntu)
npm install -g pm2
pm2 start src/server.js --name qlsv-api --node-args="--env-file=.env"
pm2 startup && pm2 save # tự chạy khi khởi động máy
pm2 logs qlsv-api # xem log# Dockerfile
FROM node:24-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "src/server.js"]Dịch vụ dễ dùng cho sinh viên: Render, Railway, Fly.io (kết nối GitHub, tự build); đặt biến môi trường trên bảng điều khiển của dịch vụ. Đặt Nginx phía trước làm reverse proxy và bật HTTPS (Let’s Encrypt) khi tự quản VPS.
Tách app.js (tạo và cấu hình Express) khỏi server.js (gọi listen) để vừa test được, vừa gắn được Socket.IO.
Đặt NODE_ENV=production khi triển khai: Express tắt thông tin lỗi chi tiết và chạy nhanh hơn.
- Viết 5 test cho API sinh viên.
- Thêm thông báo thời gian thực khi có điểm mới.
- Chạy ứng dụng bằng PM2 trên máy bạn.
- Đóng gói Docker và triển khai lên Render.
- node:test + supertest kiểm thử API.
- Socket.IO cho tính năng thời gian thực.
- PM2 giữ ứng dụng chạy; Docker đóng gói.
- Biến môi trường, NODE_ENV, HTTPS khi triển khai.