Tutorial/JavaScript 快速入門

用 JavaScript 同 Node.js 做貨幣換算

用全域 fetch API 攞即時匯率,喺 JavaScript 換算金額。Node 18+、Deno、Bun 同現代瀏覽器都用得。起步唔使 key,免費計劃每月 10,000 次呼叫。

ERexchangerate.dev·Jun 19, 2026·5 分鐘閱讀

喺 JavaScript 攞匯率最快嘅路徑,係用 fetch GET /v1/latest/USD。回應係普通 JSON,包含 31 種貨幣嘅匯率同兩個新鮮度欄位:sourcemarket_session第一次呼叫唔使 API key。

Key points
全域 fetch 喺 Node 18+、Deno、Bun 同瀏覽器都係開箱即用,唔使額外依賴。
一次 GET /v1/latest/{base} 就返回 31 種貨幣嘅匯率,加埋 sourcemarket_session
Authorization: Bearer exr_live_... 傳 key;如果平台設定唔到 Authorization,就用 X-API-Key
免費計劃每月 10,000 次呼叫、每分鐘 12 次請求,唔使信用卡。
匯率係指示性,只供參考同分析 — 唔係交易報價。

第一次呼叫,唔使 key

喺 Node 18 或者任何現代瀏覽器,fetch 已經有。一個 await 就讀到 EUR 匯率:

javascript · no keycopy
const response = await fetch("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP", {
  signal: AbortSignal.timeout(10_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
const data = await response.json();
console.log(data.rates.EUR);
console.log(data.sources.EUR, data.effective_at.EUR);
console.log(data.market_session);

匿名呼叫係按 IP 地址設上限嘅,所以過咗簡單測試就應該轉用免費 key。

加 key 同錯誤處理

將 key 以 bearer token 形式放入 Authorization 標頭。檢查 res.ok,狀態唔對就 throw,等錯誤早啲浮面:

javascript · authenticated call with error handlingcopy
// Node.js server only. Never put an account key in browser code.
const KEY = process.env.EXCHANGERATE_API_KEY;
if (!KEY) throw new Error("Set EXCHANGERATE_API_KEY on your server");

async function getLatest(base = "USD") {
  const response = await fetch(`https://api.exchangerate.dev/v1/latest/${encodeURIComponent(base)}`, {
    headers: { Authorization: `Bearer ${KEY}` },
    redirect: "error",
    signal: AbortSignal.timeout(10_000),
  });
  if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
  return response.json();
}

const data = await getLatest("USD");
console.log(data.rates.GBP, data.effective_at.GBP);

X-API-Key: exr_live_... 標頭都接受,畀嗰啲設定唔到 Authorization 標頭嘅平台用(部分 serverless runtime、Zapier 呢類 no-code 工具)。

換算一個金額

想直接換算就呼叫 /v1/convert/{from}/{to}/{amount}。一個來回就攞到匯率同換算結果:

javascript · convert 100 USD to EURcopy
// Node.js server only.
const KEY = process.env.EXCHANGERATE_API_KEY;
if (!KEY) throw new Error("Set EXCHANGERATE_API_KEY on your server");
const response = await fetch("https://api.exchangerate.dev/v1/convert/USD/EUR/100", {
  headers: { Authorization: `Bearer ${KEY}` },
  redirect: "error",
  signal: AbortSignal.timeout(10_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("Retry-After")}`);
const data = await response.json();
console.log(data.rate, data.converted);

convert 端點同 latest 一樣返回 sourcemarket_session,所以你可以話畀用戶知匯率屬於邊一類,以及銀行同業交易週而家開唔開市。

理解 source 同 market_session

請用 sources[currency] 查看所顯示貨幣的資料來源類別,並用 effective_at[currency] 查看觀測時間。source 概括整個回應中更新頻率最低的資料。market_session 表示市場交易時段;timestamp 是回應產生時間,並非匯率觀測時間。

欄位值意思幾時郁
source: live綜合現貨共識值交易週日內(約 60 秒一次)
source: ecb_daily歐洲央行參考定盤價每個工作日一次(約 16:00 CET)
source: fred_daily聯儲局每日系列每個工作日一次
market_session: weekend星期六或者星期日(銀行同業休市)參考定盤價維持星期五數值;即時數據暫停更新

data_updated_at 欄位話你知底層匯率最後一次寫入嘅時間;timestamp 記錄嘅係回應生成嘅時間。兩個一齊睇,就可以決定點快取、點顯示。

只係指示性匯率
呢啲匯率係為參考、分析同顯示而發佈,唔係交易報價,唔可以用嚟結算交易或者轉賬。每個回應嘅 notice 欄位都有講明。

免費計劃限額

每月配額於每月1日00:00 UTC重設。收到429時,請按Retry-After指定的時間等候後再試。

  • 每月 10,000 次呼叫
  • 每分鐘 12 次請求
  • 唔使信用卡
  • 涵蓋 /v1/latest/v1/convert/v1/range/v1/{date}/{base}
ER
exchangerate.dev
為開發者提供嘅整合指南。

延伸閱讀

Tutorial用 Python 攞匯率嘅方法閱讀 Guide一次呼叫攞歷史匯率同時間序列閱讀 Reference點樣讀 source 同 market_session閱讀
更多比較Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
學習Reading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
即時匯率EUR/USDGBP/USDUSD/JPY