学习/JavaScript 快速入门

用 JavaScript 和 Node.js 进行货币换算

用 fetch 获取汇率,用 JSON 结果换算金额,再用 currency.js 处理金额和格式。

ERexchangerate.dev·更新于 2026 年 10 月 1 日·阅读 6 分钟

浏览器可以从匿名调用开始。Node.js 或服务器应用应把密钥放在环境变量中,同时保留汇率的来源和观测时间。

要点
Node 18+、Deno、Bun 和现代浏览器都支持 fetch。
不要把账户密钥放进浏览器代码。
currency.js 处理金额和格式,不负责获取汇率。
检查 HTTP 状态,收到 429 时遵循 Retry-After。
需要解释时显示 source 和 effective_at。

从浏览器发起请求

小型计算器或测试可以使用无密钥调用。只请求需要的 symbols,并设置超时。

把密钥移到服务器

生产应用应从 Node.js、Route Handler 或其他服务器服务调用。密钥只能留在服务器环境。

计算并格式化金额

currency.js 适合金额、精度和格式;先从 API 获取汇率,再计算金额。

读取新鲜度和错误

检查 sources、effective_at、source 和 market_session。429 需要退避,汇率是指示性数据而非可执行报价。

常见问题

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);
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);
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);
JavaScript · currency.jscopy
import currency from "currency.js";

const response = await fetch("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR", {
  signal: AbortSignal.timeout(10_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
const rate = data.rates.EUR;
if (!Number.isFinite(rate) || rate <= 0) throw new Error("Invalid rate");
const euros = currency("100.00", { precision: 2, symbol: "€" }).multiply(rate);
console.log(euros.format());
ER
exchangerate.dev
面向开发者的集成指南。

继续阅读

Tutorial用 Python 获取汇率阅读 Tutorial历史汇率和时间序列阅读
比较Fixer vs exchangerate.dev比较Open Exchange Rates vs exchangerate.dev比较Currencylayer vs exchangerate.dev指南用 Python 获取汇率指南在 Next.js 与 TypeScript 中使用汇率指南用 Python 构建 USD/IDR 汇率提醒实时汇率EUR/USD实时汇率GBP/USD实时汇率USD/JPY