1298 字
6 分鐘

wrangler kv bulk put 二進位資料損壞?先升級 4.125.0

如果你用 wrangler kv bulk put 批次上傳圖片、壓縮檔或其他二進位內容,先確認 Wrangler 版本與儲存位置。Wrangler 4.125.0 修正了一個本機 KV 問題:JSON 項目標記 base64: true,且解碼後包含無法組成有效 UTF-8 的位元組時,舊版可能把值以錯誤的內容寫入 local KV。

這個修正有清楚的邊界:官方 release note 指出,受影響的是本機 kv bulk put;remote 寫入、沒有 base64 的項目,以及 kv key put 都不在這個問題範圍內。升級到 4.125.0 或更新版本後,仍要重新寫入已經損壞的本機資料;工具更新不會自動修復舊值。

先分清 localremote#

Wrangler v4 的 KV 命令預設使用本機資料。需要操作 Cloudflare API 或正式 namespace 時,必須明確加上 --remote;只寫一個沒有旗標的命令,不能當成「一定會更新雲端」。

目的建議寫法寫入位置
本機 wrangler dev 測試wrangler kv bulk put fixture.json --binding=MY_KV --locallocal KV
寫入 Cloudflare namespacewrangler kv bulk put fixture.json --binding=MY_KV --remoteremote KV
單筆本機二進位資料wrangler kv key put fixture.bin --path=./fixture.bin --binding=MY_KV --locallocal KV

--binding=MY_KV 要換成 wrangler.tomlwrangler.jsonc 中的 KV binding 名稱;如果沒有 binding,也可以依官方命令使用 --namespace-id。不論使用哪一種方式,都把 --local--remote 寫進腳本,避免日後升級 Wrangler 後因預設值誤解而寫錯地方。

如何確認自己真的遇到這個問題#

先看專案實際執行的 Wrangler,而不是只看全域安裝版本:

Terminal window
pnpm exec wrangler --version

建立一個只供測試的二進位 fixture。以下 Node.js 腳本會把檔案轉成 base64,產生 kv bulk put 需要的 JSON;不要把正式資料直接拿來做第一次驗證:

Terminal window
node - <<'NODE'
const fs = require('node:fs');
const value = fs.readFileSync('fixture.bin').toString('base64');
fs.writeFileSync(
'fixture.json',
JSON.stringify([{ key: 'fixture.bin', value, base64: true }], null, 2),
);
NODE

在受測版本上寫入 local KV:

Terminal window
pnpm exec wrangler kv bulk put fixture.json --binding=MY_KV --local

接著由 wrangler dev 中的 Worker 以 arrayBuffer 讀回 fixture.bin,比較寫入前後的長度與 SHA-256。不要用 --text 讀二進位值,因為該旗標會把結果解碼為 UTF-8 字串;即使檔案原本不是文字,驗證程式也可能因此掩蓋問題。

若想用 CLI 確認資料流程,kv bulk get 可以輸出批次結果,或先用 kv key get 列出該 key;真正的判斷仍應以 Worker 讀回的 ArrayBuffer bytes 為準。測試 namespace、--persist-to 位置和 fixture.bin 都應該是可拋棄的資料。

正確修復流程#

1. 將 Wrangler 固定在已修正版本#

專案使用 pnpm 時,將 Wrangler 放在專案的 devDependencies,再重新產生 lockfile:

Terminal window
pnpm add --save-dev wrangler@^4.125.0
pnpm exec wrangler --version

如果專案已經有版本範圍,至少確認 lockfile 實際解析到 4.125.0 以上;CI 和本機都使用 pnpm exec wrangler,不要讓全域舊版混進測試。

2. 重跑 local binary fixture#

升級後清理或換一個 local persistence 目錄,重新執行 kv bulk put,再由 Worker 讀回並比對 bytes。清掉舊 local KV 只能移除測試資料,不會修復資料本身;如果這些資料是要保留的,請從原始檔案重新產生 JSON 後再寫入。

3. 需要正式資料時明確指定 --remote#

把批次寫入正式 namespace 的流程寫成:

Terminal window
pnpm exec wrangler kv bulk put fixture.json --binding=MY_KV --remote

執行前確認帳號、環境和 namespace ID。--remote 代表會呼叫 Cloudflare API,不能在沒有 review 或備份的情況下直接套到 production script;若只想測試序列化結果,保留 --local

不要把三種問題混在一起#

  • 讀回 bytes 變長或內容不同:先看是不是舊版 Wrangler、base64: true、local KV,以及內容是否包含無效 UTF-8 位元組。
  • 寫入了錯的 namespace:先檢查 Wrangler v4 的 local 預設和是否漏了 --remote,這不是同一個 binary corruption bug。
  • 只有文字值失敗:沒有 base64 或內容是有效 UTF-8 時,官方 4.125.0 release note 描述的案例不一定適用,應另外檢查 binding、JSON 格式和權限。

這樣分層後,才不會為了修 local fixture 而誤改正式 KV,也不會把遠端 API 的權限錯誤誤判成二進位編碼問題。

常見問題#

Q: base64: true 是不是代表 Wrangler 會把資料當成文字?#

A: 不是。它表示 JSON 中的 value 以 Base64 表示,寫入 KV 時應還原成原始 bytes。這也是為什麼圖片、壓縮檔和其他非 UTF-8 內容需要用它;不要先把二進位檔轉成一般文字再上傳。

Q: 已經使用 Wrangler 4.125.0,還需要把遠端資料全部重寫嗎?#

A: 官方修正針對 local KV。release note 說明 remote writes 沒有受到這個問題影響;先確認你的寫入確實使用 --remote,再依實際 checksum 和資料來源決定是否需要回補,不要因為升級版本就無差別重寫 production namespace。

Q: 單筆 kv key put --path 可以當成替代方案嗎?#

A: 對單一檔案可以。官方 release note 將 kv key put 列為不受此問題影響的路徑,但批次流程仍建議升級 Wrangler,並明確標示 --local--remote

參考資料:

Wrangler 4.125.0 release notes:修正 local KV binary values

Cloudflare Docs:KV commands

Cloudflare Docs:Adding local data

Cloudflare Docs:Migrate from Wrangler v3 to v4

wrangler kv bulk put 二進位資料損壞?先升級 4.125.0
https://laplusda.com/posts/cloudflare-wrangler-kv-bulk-binary-fix/
作者
Zero
發佈於
2026-08-25
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

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