チュートリアル/Reactで通貨コンバーターを作る

Reactで通貨コンバーターを作る

Reactで通貨コンバーターを作る. コード、キャッシュ、鮮度メタデータを含む実践ガイドです。

ERexchangerate.dev·Sep 20, 2026·7分で読めます

認証情報を公開せず、出典と観測時刻を保持してサーバー側で実装します。

要点
APIキーはサーバーだけに保存する。
通貨コードと金額を検証する。
成功したレスポンスをキャッシュする。
出典と観測時刻を表示する。

手順 1

サーバー側で実行し、入力を検証してレスポンスのメタデータを保存します。

コード例copy
import { NextRequest, NextResponse } from "next/server";

export async function GET(request: NextRequest) {
  const { searchParams } = request.nextUrl;
  const from = searchParams.get("from")?.toUpperCase();
  const to = searchParams.get("to")?.toUpperCase();
  const amount = Number(searchParams.get("amount"));
  if (!from || !to || !Number.isFinite(amount) || amount < 0) {
    return NextResponse.json({ error: "invalid_input" }, { status: 400 });
  }

  const response = await fetch(
    `https://api.exchangerate.dev/v1/convert/${from}/${to}/${amount}`,
    {
      headers: { Authorization: `Bearer ${process.env.EXCHANGERATE_API_KEY}` },
      signal: AbortSignal.timeout(5000),
      next: { revalidate: 60 },
    },
  );
  return NextResponse.json(await response.json(), { status: response.status });
}

手順 2

コード例copy
"use client";

import { FormEvent, useState } from "react";

type ConversionResult = {
  converted: string;
  source: string;
  data_updated_at: string;
};

export function CurrencyConverter() {
  const [amount, setAmount] = useState("100");
  const [result, setResult] = useState<ConversionResult | null>(null);
  const [error, setError] = useState("");
  const [loading, setLoading] = useState(false);

  async function submit(event: FormEvent) {
    event.preventDefault();
    setLoading(true); setError("");
    try {
      const params = new URLSearchParams({ from: "USD", to: "EUR", amount });
      const response = await fetch(`/api/convert?${params}`);
      const body = await response.json();
      if (!response.ok) throw new Error(body.error ?? "conversion_failed");
      setResult(body);
    } catch (caught) {
      setError(caught instanceof Error ? caught.message : "conversion_failed");
    } finally { setLoading(false); }
  }

  return <form onSubmit={submit}>
    <input value={amount} onChange={(event) => setAmount(event.target.value)} inputMode="decimal" />
    <button disabled={loading}>{loading ? "Converting…" : "Convert"}</button>
    {error && <p role="alert">{error}</p>}
    {result && <output>{result.converted} EUR · {result.source} · {result.data_updated_at}</output>}
  </form>;
}

手順 3

  • APIキーはサーバーだけに保存する。
  • 通貨コードと金額を検証する。
  • 成功したレスポンスをキャッシュする。
  • 出典と観測時刻を表示する。
ガイド
表示される値は参考レートであり、決済価格ではありません。
ER
exchangerate.dev
通貨データを扱う開発者向けの実践ガイド。

関連記事

ガイド開発者向け通貨換算API読む ガイドJavaScriptとNode.jsによる通貨換算読む ガイドAPI errors and response fields読む