Series Chinh phục Vercel | Bài 2: Serverless Functions - "Viết API không cần Server"
Trong kiến trúc Serverless, tư duy của bạn phải thay đổi: Đừng viết một ứng dụng to đùng (Monolithic). Hãy chia nhỏ mọi thứ ra thành các hàm (Functions). Mỗi một hàm là một API endpoint.
Ví dụ:
- /api/get-station-status.js -> Hàm này chỉ làm nhiệm vụ lấy trạng thái trạm.
- /api/process-ticket.js -> Hàm này chỉ làm nhiệm vụ xử lý giao dịch.
1. Cấu trúc thư mục "Vàng"
Vercel sẽ tự động biến mọi file nằm trong thư mục /api thành các đường dẫn API tương ứng. Bạn không cần cấu hình Router rườm rà như Express.js nữa.
/my-afc-project
├── /api
│ ├── status.js => Truy cập tại: /api/status
│ └── transactions.js => Truy cập tại: /api/transactions
├── package.json
└── README.md
2. Viết API truy vấn Database (Thực chiến)
Giả sử bạn cần một API trả về thông tin giao dịch vé cuối cùng. Chúng ta sẽ dùng thư viện pg (Postgres) như đã học ở series Heroku.
File: /api/transactions.js
const { Pool } = require('pg');
// Khởi tạo Pool kết nối (Nên để biến này ở ngoài hàm handler để tái sử dụng)
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
export default async function handler(req, res) {
// Chỉ cho phép phương thức GET
if (req.method !== 'GET') {
return res.status(405).json({ message: 'Chỉ chấp nhận phương thức GET' });
}
try {
const { rows } = await pool.query('SELECT * FROM transactions ORDER BY created_at DESC LIMIT 10');
return res.status(200).json({
status: 'success',
data: rows
});
} catch (error) {
console.error(error);
return res.status(500).json({ message: 'Lỗi truy vấn Database' });
}
}
3. Cấu hình biến môi trường trên Vercel
Bạn không bao giờ được hardcode DATABASE_URL vào code.
- Tại Dashboard Vercel, chọn Project -> Settings -> Environment Variables.
- Thêm DATABASE_URL và dán giá trị kết nối của bạn vào.
- Nhấn Save.
Mẹo chuyên nghiệp: Để chạy được code này dưới local, bạn hãy cài thêm gói vercel (npm i -g vercel), sau đó tạo file .env.local ở thư mục gốc. Vercel CLI sẽ tự động nạp các biến này khi bạn chạy lệnh vercel dev.
4. Đặc điểm "sống còn" của Serverless (Stateless)
Khi viết API trên Vercel, bạn phải nhớ: Serverless là Stateless (không lưu trạng thái).
- Không nên: Lưu biến toàn cục (let count = 0) để đếm số lần gọi API, vì mỗi lần gọi, Vercel có thể khởi tạo một Function mới ở một khu vực địa lý khác nhau. Biến đó sẽ luôn bị reset.
- Nên: Lưu trạng thái vào Database (Postgres) hoặc Cache (Redis).
5. Khả năng Scale "vô tận"
Điều gì xảy ra nếu hôm nay toàn bộ 14 nhà ga Metro đồng loạt đẩy dữ liệu về?
- Nếu dùng Heroku: Server của bạn có thể bị treo nếu Dyno không chịu nổi.
- Với Vercel Serverless: Nếu 1.000 yêu cầu đến cùng lúc, Vercel sẽ tự động khởi tạo 1.000 "instance" của hàm /api/transactions cùng một lúc trên mạng lưới Edge của họ. Bạn không cần làm gì cả. Hệ thống tự "phình" ra và tự "co" lại.
Bài tập cho bạn
Hãy thử tạo một file /api/ping.js trả về thời gian hiện tại của hệ thống. Sau đó, chạy lệnh vercel dev trên máy tính để test thử. Bạn sẽ thấy cảm giác API "sống" lên trong tích tắc mà không cần cài đặt Web Server (Apache/Nginx) nào cả.
All rights reserved