Cloudflare Hyperdrive MySQL 怎麼接?用 mysql2 設定 Workers binding
如果 Worker 要連接既有的 MySQL,Hyperdrive 的角色不是把資料庫搬到 Cloudflare,而是提供 Worker 可使用的連線資訊,並在 Cloudflare 網路中處理連線池與查詢快取。Cloudflare 在 2026-08-07 宣布 Hyperdrive 的 MySQL 支援正式可用;原本使用 mysql2 的程式,不需要因為換成 Hyperdrive 而改寫成另一套 ORM。
這篇用 mysql2/promise 寫一個最小查詢,重點放在 binding、Node.js 相容性、本機開發與「本機測試其實沒有走 Hyperdrive」這個容易誤判的邊界。
Hyperdrive MySQL 先分清楚三個責任
| 元件 | 負責什麼 | 不負責什麼 |
|---|---|---|
| MySQL | 保存資料、帳號、權限與 schema | 不會因為接上 Hyperdrive 就自動開放外部連線 |
| Hyperdrive | 產生 Worker 可用的連線資訊、集中連線池,並支援查詢快取 | 不會替你決定 SQL 權限或資料庫防火牆規則 |
Worker + mysql2 | 送出查詢、處理結果與錯誤 | 不應把資料庫密碼硬編碼在程式碼或前端 bundle |
這個分工也解釋了為什麼「binding 已經出現在 Wrangler 輸出」不代表查詢一定成功。仍要檢查 MySQL 使用者權限、TLS、來源網路與查詢本身。
建立 Hyperdrive 並取得 binding ID
先用 Wrangler 建立一個 Hyperdrive 設定。官方命令會使用 MySQL connection string 建立連線設定:
npx wrangler hyperdrive create my-mysql --connection-string="mysql://USER:[email protected]:3306/app"這個指令需要能連到資料庫的帳號。不要把真實 connection string 寫進 shell history、shell script 或 commit;如果團隊已經有平台化的建立流程,改用 Cloudflare Dashboard 或 API 管理建立時的憑證輸入。指令輸出的 Hyperdrive ID 才需要放進 Wrangler 設定檔。
Wrangler 設定要留下兩個關鍵欄位
把 binding 放在 Worker 專案的 wrangler.jsonc。Cloudflare 的 MySQL 範例要求使用 Node.js compatibility,mysql2 也要在 Worker 執行環境使用相容模式:
{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "mysql-worker", "main": "./src/index.ts", "compatibility_date": "2026-08-20", "compatibility_flags": [ "nodejs_compat" ], "hyperdrive": [ { "binding": "HYPERDRIVE", "id": "<your-hyperdrive-id>" } ]}2026-08-04 之後的新 compatibility date 會涵蓋部分 Node.js compatibility 行為,但不要把「平台預設已改變」誤當成「既有專案可以不測試就刪 flag」。先保留設定,等測試完成後再依 compatibility_date 升級清單決定是否清理。
接著安裝官方文件指定的最低版本:
pnpm add mysql2@'>=3.13.0'用 mysql2/promise 查詢 MySQL
最小的 Worker 可以這樣寫:
import { createConnection } from "mysql2/promise";
export default { async fetch(_request: Request, env: Env): Promise<Response> { const connection = await createConnection({ host: env.HYPERDRIVE.host, user: env.HYPERDRIVE.user, password: env.HYPERDRIVE.password, database: env.HYPERDRIVE.database, port: env.HYPERDRIVE.port, disableEval: true, });
try { const [rows] = await connection.query( "SELECT id, name FROM users ORDER BY id DESC LIMIT 10", );
return Response.json({ rows }); } catch (error) { console.error(error); return Response.json({ error: "database query failed" }, { status: 500 }); } },} satisfies ExportedHandler<Env>;這裡刻意每次 request 建立一個 connection,因為 Hyperdrive 會處理底層的資料庫連線池;不要把連線物件放在 module global,然後假設它能跨越所有 Worker invocation 永遠有效。disableEval: true 不是一般 MySQL 的通用設定,而是 Cloudflare 文件對 mysql2 在 Workers 的要求。
如果 TypeScript 還沒有自動產生 Env 型別,可以先用 Wrangler 產生:
npx wrangler types本機 wrangler dev 不會走 Hyperdrive
這是最容易把測試結果看錯的地方。預設的 wrangler dev 會在本機執行 Worker,並直接連到 localConnectionString 指定的資料庫;這個模式不會啟用 Hyperdrive 的連線池與 query caching。
建議用環境變數提供本機連線字串,避免把密碼寫進 wrangler.jsonc:
export CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE="mysql://USER:[email protected]:3306/app?sslMode=required"npx wrangler dev若要測試實際 Hyperdrive 行為,才使用:
npx wrangler dev --remote--remote 會在 Cloudflare 網路執行 Worker,使用已部署的 Hyperdrive 設定;本機程式的寫入與副作用可能碰到遠端資料庫。先準備測試資料庫或唯讀帳號,再用遠端模式驗證 pooling、快取與實際網路路徑。
上線前用四層檢查找錯
- Binding:
wrangler deploy --dry-run是否讀到正確的HYPERDRIVEID,env.HYPERDRIVE是否有 host、port 與 database。 - Driver:
mysql2是否至少為 3.13.0,並保留disableEval: true與必要的 Node.js compatibility。 - 資料庫入口:MySQL 帳號是否允許 Hyperdrive 連線、TLS 模式是否符合資料庫要求、
SELECT/INSERT權限是否足夠。 - 測試模式:本機
dev測到的是 direct connection;要檢查 Hyperdrive 的 pooling 或 query cache,必須用隔離的遠端環境,不要把 production 當成測試資料庫。
如果查詢本身成功,但延遲或資料內容不符合預期,先把「本機 direct connection」與「遠端 Hyperdrive connection」分開比較。這比只換 driver 或反覆重建 binding 更容易定位問題。
結論:先把連線路徑說清楚,再決定要不要快取
Hyperdrive MySQL 的最小可用組合是:HYPERDRIVE binding、[email protected] 以上、Workers 的 Node.js compatibility,以及 disableEval: true。本機開發使用 localConnectionString 時,測的是直接連資料庫;只有 wrangler dev --remote 或正式部署才會驗證 Hyperdrive 的連線池與快取。
Q: Hyperdrive MySQL 需要改用 Cloudflare D1 嗎?
A: 不需要。Hyperdrive 是連接既有 MySQL 的 binding,資料仍在原本的 MySQL 服務;D1 是另一種資料庫產品。若既有 schema、ORM 或資料庫供應商已經固定,先用 Hyperdrive 會比為了部署位置重寫資料層更直接。
Q: wrangler dev 查得到資料,為什麼正式環境仍然連不上?
A: 本機模式可能是透過 localConnectionString 直接連本機或遠端資料庫,沒有走 Hyperdrive。正式環境還要驗證 Hyperdrive ID、MySQL 防火牆、TLS、帳號權限與資料庫是否允許 Cloudflare 的連線來源。
Q: 可以把 mysql2 的 connection 放在全域變數重用嗎?
A: 不要把它當成必要前提。Cloudflare 的範例是在每次 request 建立 connection,並由 Hyperdrive 維持底層連線池;這樣可避免把已失效的連線物件跨 request 重用。先依官方範例驗證,再針對實際流量與連線限制調整。
參考資料:
Cloudflare Changelog:MySQL support in Hyperdrive is now generally available
回報錯字、失效連結,或告訴我你想看的延伸主題。