Fastify là gì?
Fastify là một web framework cho Node.js, tập trung vào tốc độ và chi phí xử lý thấp. Nó làm cùng việc như Express — route, middleware, xử lý request — nhưng có hệ thống plugin, validation bằng JSON schema và logging có cấu trúc là tính năng gốc.
Một server tối thiểu
import Fastify from 'fastify'
const app = Fastify({ logger: true })
app.get('/health', async () => ({ status: 'ok' }))
await app.listen({ port: 3000, host: '0.0.0.0' })
Handler chỉ cần return một giá trị (hoặc throw); không phải gọi
res.send(), và hàm async hoạt động tự nhiên.
Plugin
Mọi thứ trong Fastify đều là plugin: route, xác thực, file tĩnh, truy cập database. Một tính năng được đăng ký một lần và được đóng gói riêng, nên không vô tình làm rò trạng thái sang phần còn lại của ứng dụng:
await app.register(fastifyCookie)
await app.register(fastifyStatic, { root: publicDir })
await app.register(orderRoutes) // route do mình viết, cũng là plugin
Tách API thành routes/auth.js, routes/orders.js… — mỗi file là một
plugin — giúp một service nhỏ gọn gàng mà không cần framework nặng.
Những điểm hay gặp ở service thật
- Raw request body: chữ ký webhook (ví dụ HMAC của Shopify) được tính trên đúng các byte nhận được. Hãy parse JSON từ raw buffer bằng content-type parser tuỳ biến và giữ lại bản gốc, nếu không việc serialize lại body sẽ làm thay đổi nó và chữ ký không bao giờ khớp.
trustProxy: phía sau reverse proxy như Caddy, hãy bậttrustProxy: trueđểrequest.iplà địa chỉ của khách lấy từX-Forwarded-For. Không bật thì giới hạn tốc độ theo IP sẽ thấy mọi request đều đến từ proxy.- Rate limiting:
@fastify/rate-limitcó thể đăng ký vớiglobal: falsevà chỉ áp dụng cho các route nhạy cảm như đăng nhập. - Frontend tĩnh:
@fastify/staticphục vụ một giao diện vanilla-JS không cần build ngay trong cùng process với API.
Khi nào nên chọn Fastify
- API hoặc service quy mô nhỏ đến vừa, khi Express thấy lỏng lẻo còn framework lớn thì nặng
- Muốn có sẵn validation, logging và đóng gói plugin
- Thông lượng và độ trễ quan trọng
Đọc thêm
Tài liệu chính thức: fastify.dev