---
id: serverless-edge
title: "Cloudflare Workers và Vercel"
shortTitle: "Workers, Vercel"
track: serverless
trackTitle: "Serverless"
order: 2
level: core
status: published
estimatedMinutes: 30
prerequisites:
  - serverless-functions
next: serverless-gcp
reviewedAgainst: 2026-10-12
sources:
  - title: "Cloudflare Workers — how it works"
    url: https://developers.cloudflare.com/workers/reference/how-workers-works/
  - title: "Vercel — functions"
    url: https://vercel.com/docs/functions
---

# Cloudflare Workers và Vercel

Bài trước là function chạy trong region bạn chọn. Workers và Vercel Functions chạy gần user hơn, và gắn với việc phát HTTP.

## Để làm gì

Biết cái gì nên đặt ở edge: sửa header, xác thực đơn giản, cache, redirect. Cái gì không nên: kết nối database ở một region trong khi function chạy khắp thế giới.

## Gồm những gì

- Worker nhận `Request`, trả `Response`. Runtime không phải Node đầy đủ.
- Vercel Function nằm cùng repo với frontend.
- Hệ quả của edge: latency tới database một region có thể tệ hơn là chạy function cạnh database.

Netlify cùng kiểu với Vercel: frontend kèm function. Bài riêng nằm cuối track này.

## Dùng khi nào

Site đã đứng sau Cloudflare, cần sửa request trước khi tới origin. Hoặc frontend trên Vercel, một API nhỏ nằm cạnh trang.

Đừng chuyển API đang dùng connection pool tới Postgres sang Worker chỉ vì "edge cho nhanh". Mỗi request từ một thành phố khác nhau mở đường tới database một chỗ. Chậm và dễ cạn connection.

## Kiến thức cốt lõi

Cloudflare mô tả Workers chạy trên runtime riêng, không phải một VM Node cho mỗi request. API quen thuộc là `fetch`. Một số package Node dùng API không có trong runtime này sẽ fail lúc build hoặc lúc chạy. Đọc docs "how Workers works" trước khi mang nguyên một app Express sang.

Vercel Function là phần backend nhỏ, deploy cùng project. Hợp form, webhook, gọi dịch vụ khác. Timeout và runtime nằm trong docs Functions của Vercel, và đổi theo plan. Đừng nhớ một số phút từ blog. Mở docs của plan bạn đang trả tiền.

Edge hợp khi dữ liệu cần đã nằm ở cache hoặc ở chính request (JWT, cookie, header). Không hợp khi mỗi request phải đọc ghi một database xa.

## Lệnh và code mẫu

Một Worker, hình dạng tối thiểu theo API `Request` và `Response`:

```javascript
export default {
  async fetch(request) {
    const url = new URL(request.url);
    if (url.pathname === "/health") {
      return new Response("ok", { status: 200 });
    }
    return fetch(request);
  },
};
```

`return fetch(request)` đẩy tiếp tới origin. `/health` không chạm origin.

Không có lab deploy. Đọc một project Vercel thì tìm file trong `app/api` hoặc `api/`. Đó là function, không phải server luôn chạy.

## Thực hành

1. Với một API bạn có, liệt kê path nào chỉ đọc header hoặc cache. Path đó là ứng viên edge.
2. Liệt kê path nào mở Postgres hoặc Mongo. Giữ path đó cạnh database, không đẩy ra edge.
3. Nếu repo có thư mục `api/` trên Vercel hoặc file worker: ghi runtime đang khai báo. Không có repo thì ghi "chưa dùng".

## Kết quả mong đợi

- Ít nhất một ví dụ nên ở edge và một ví dụ không nên.
- Bạn không kết luận "edge luôn nhanh hơn".

## Checklist

- [ ] Worker không được giả định là Node đầy đủ.
- [ ] Path có database thì không mặc định đưa ra edge.
- [ ] `/health` ở edge không chứng minh origin còn sống.
- [ ] Timeout của Vercel xem theo plan, không nhớ số từ một bài cũ.

## Lỗi thường gặp

**`fetch` tới Postgres từ mọi thành phố.** Hết connection, latency cao. Function vùng cạnh database, hoặc một pooler đặt cố định một region.

**Health check của Worker trả 200 trong khi origin chết.** Worker tự trả `ok` thì monitor xanh, user vẫn lỗi. Health của origin phải đi tới origin, hoặc trả lỗi khi `fetch` origin thất bại.

**Mang package dùng `fs` vào Worker.** Runtime không có filesystem của Node. Build fail hoặc chạy fail. Đổi package, hoặc đừng dùng Worker cho việc đó.

## Nguồn

1. [How Workers works](https://developers.cloudflare.com/workers/reference/how-workers-works/) — Cloudflare, runtime và cách nhận request.
2. [Vercel Functions](https://vercel.com/docs/functions) — function đi cùng project, giới hạn theo plan.

## Tiếp theo

[Cloud Run functions](./03-gcp-functions.md)
