🎄

ReactとMicroCMSでお問い合わせフォームの作成

2024/12/05に公開

ディレクトリ構成

my-app/
    backend/
      node_modules/
      package-lock.json
      package.json
      .env
      server.js
    frontend/
      README.md
      node_modules/
      package.json
      public/
        index.html
        favicon.ico
      src/
        App.css
        App.js
        App.test.js
        index.css
        index.js
        logo.svg

フロントエンドのセットアップ

まず、既存のmy-appプロジェクトにContactFormを作成します。

必要なライブラリのインストール

以下のコマンドを実行して、HTTPリクエスト用ライブラリ(axios)を追加します:

cd my-app
cd frontend
npm install axios

ディレクトリ構成の調整

プロジェクト内に新しいコンポーネントを追加するため、src/components/ContactForm.jsファイルを作成します。

mkdir src/components
touch src/components/ContactForm.js

ContactFormコンポーネントの実装

import React, { useState } from "react";
import axios from "axios";

const ContactForm = () => {
  const [formData, setFormData] = useState({
    name: "",
    email: "",
    message: "",
  });

  const [status, setStatus] = useState("");

  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormData({ ...formData, [name]: value });
  };

  const handleSubmit = async (e) => {
    e.preventDefault();

    try {
         const response = await axios.post(
            process.env.REACT_APP_MICROCMS_ENDPOINT,
              formData,
              {
                headers: {
                  "Content-Type": "application/json",
                  "X-API-KEY": process.env.REACT_APP_MICROCMS_API_KEY,
                },
              }
          );
      if (response.status === 200) {
        setStatus("Success: Your message has been sent!");
        setFormData({ name: "", email: "", message: "" });
      }
    } catch (error) {
      console.error(error);
      setStatus("Error: Something went wrong. Please try again.");
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label>Name:</label>
        <input
          type="text"
          name="name"
          value={formData.name}
          onChange={handleChange}
          required
        />
      </div>
      <div>
        <label>Email:</label>
        <input
          type="email"
          name="email"
          value={formData.email}
          onChange={handleChange}
          required
        />
      </div>
      <div>
        <label>Message:</label>
        <textarea
          name="message"
          value={formData.message}
          onChange={handleChange}
          required
        ></textarea>
      </div>
      <button type="submit">Send</button>
      {status && <p>{status}</p>}
    </form>
  );
};

export default ContactForm;

APIやURLは自身のMicroCMSから取得。

App.jsでコンポーネントを利用

src/App.jsでContactFormをインポートし、使用します

import React from "react";
import ContactForm from "./components/ContactForm";

function App() {
  return (
    <div className="App">
      <h1>Contact Us</h1>
      <ContactForm />
    </div>
  );
}

export default App;

MicroCMSのセットアップ

MicroCMSプロジェクトを作成

MicroCMSにアクセスしてアカウントを作成します。
新しいサービスを作成し、"contact"という名前のエンドポイントを作成します。

フィールドの設定

"name"(テキストフィールド)
"email"(テキストフィールド)
"message"(テキストエリア)

APIキーの確認

管理画面から「API設定」にアクセスし、APIキーを取得します。

APIエンドポイントの確認

MicroCMSの管理画面で、「エンドポイントURL」を確認します。

APIルールの設定

管理権限からAPIのルールを設定します。
今回使用するのはPOSTのみなので、「POST」にチェックを入れます。

バックエンドの構築

Node.jsとExpressのセットアップ

新しいディレクトリを作成してバックエンドをセットアップします。

mkdir backend
cd backend
npm init -y
npm install express body-parser axios cors dotenv

ディレクトリ構成は以下

backend/
  server.js
  .env
  package.json

.envファイルの作成

.envファイルにMicroCMSのAPIキーとエンドポイントを記述します。

MICROCMS_API_KEY=YOUR_MICROCMS_API_KEY
MICROCMS_ENDPOINT=https://YOUR_MICROCMS_ENDPOINT/contact

バックエンドコードの作成

server.jsに以下を記述します。

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");
const axios = require("axios");
const cors = require("cors");

const app = express();
const PORT = 5000;

app.use(cors());
app.use(bodyParser.json());

// Contact API
app.post("/api/contact", async (req, res) => {
  const { name, email, message } = req.body;

  try {
    const response = await axios.post(
      process.env.MICROCMS_ENDPOINT,
      { name, email, message },
      {
        headers: {
          "Content-Type": "application/json",
          "X-API-KEY": process.env.MICROCMS_API_KEY,
        },
      }
    );
    res.status(200).json({ message: "Message sent successfully!" });
  } catch (error) {
    console.error("Error sending data to MicroCMS:", error.message);
    res.status(500).json({ message: "Failed to send message." });
  }
});

app.listen(PORT, () => {
  console.log(`Backend server is running on http://localhost:${PORT}`);
});

フロントエンドの変更

フロントエンドのエンドポイントを変更

ContactForm.jsのリクエスト先をバックエンドに変更します。

const handleSubmit = async (e) => {
  e.preventDefault();

  try {
    const response = await axios.post(
      "http://localhost:5000/api/contact", // バックエンドのエンドポイント
      formData
    );
    if (response.status === 200) {
      setStatus("Success: Your message has been sent!");
      setFormData({ name: "", email: "", message: "" });
    }
  } catch (error) {
    console.error("Error sending data:", error.message);
    setStatus("Error: Something went wrong. Please try again.");
  }
};

ローカル環境での動作確認

バックエンドを起動:

cd backend
node server.js

フロントエンドを起動:

cd ../my-app
npm start

フォームを送信して、データがMicroCMSに保存されることを確認してください。

デプロイ

バックエンドのデプロイ

HerokuやRenderなどのプラットフォームを使用してバックエンドをデプロイします。
環境変数(MICROCMS_API_KEYとMICROCMS_ENDPOINT)をデプロイ時に設定してください。

フロントエンドのエンドポイント変更

バックエンドをデプロイしたURLに合わせて、フロントエンドのエンドポイントを変更します。
例:

const response = await axios.post(
  "https://your-backend-url/api/contact",
  formData
);

フロントエンドのデプロイ

VercelやNetlifyを使ってデプロイしてください。

Discussion