用 JavaScript 和 Node.js 进行货币换算
用 fetch 获取汇率,用 JSON 结果换算金额,再用 currency.js 处理金额和格式。
浏览器可以从匿名调用开始。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());