1455 字
7 分鐘

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 建立連線設定:

Terminal window
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 升級清單決定是否清理。

接著安裝官方文件指定的最低版本:

Terminal window
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 產生:

Terminal window
npx wrangler types

本機 wrangler dev 不會走 Hyperdrive#

這是最容易把測試結果看錯的地方。預設的 wrangler dev 會在本機執行 Worker,並直接連到 localConnectionString 指定的資料庫;這個模式不會啟用 Hyperdrive 的連線池與 query caching。

建議用環境變數提供本機連線字串,避免把密碼寫進 wrangler.jsonc

Terminal window
export CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_HYPERDRIVE="mysql://USER:[email protected]:3306/app?sslMode=required"
npx wrangler dev

若要測試實際 Hyperdrive 行為,才使用:

Terminal window
npx wrangler dev --remote

--remote 會在 Cloudflare 網路執行 Worker,使用已部署的 Hyperdrive 設定;本機程式的寫入與副作用可能碰到遠端資料庫。先準備測試資料庫或唯讀帳號,再用遠端模式驗證 pooling、快取與實際網路路徑。

上線前用四層檢查找錯#

  1. Bindingwrangler deploy --dry-run 是否讀到正確的 HYPERDRIVE ID,env.HYPERDRIVE 是否有 host、port 與 database。
  2. Drivermysql2 是否至少為 3.13.0,並保留 disableEval: true 與必要的 Node.js compatibility。
  3. 資料庫入口:MySQL 帳號是否允許 Hyperdrive 連線、TLS 模式是否符合資料庫要求、SELECTINSERT 權限是否足夠。
  4. 測試模式:本機 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

Cloudflare Hyperdrive:Connect to MySQL

Cloudflare Hyperdrive:mysql2

Cloudflare Hyperdrive:Local development

Cloudflare Hyperdrive MySQL 怎麼接?用 mysql2 設定 Workers binding
https://laplusda.com/posts/cloudflare-hyperdrive-mysql-workers/
作者
Zero
發佈於
2026-08-20
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。