📌

【Next.js】Next.js & Contentful BlogApp 【4Connect Contentful API】

2022/11/20に公開

【4Connect Contentful API】

YouTube: https://youtu.be/69eKZhGgPAo

https://youtu.be/69eKZhGgPAo

今回はNext.jsのアプリとContentfulのAPIの接続を行います。

接続には「contentful」のライブラリを使用します。

https://www.npmjs.com/package/contentful

npm i contentful
package.json
  "dependencies": {
    "contentful": "^9.2.12",
  },

ContentfulのAPIキーは公開するのが望ましくない情報ですので、
環境変数で設定します。

こちらのサンプルはダミーになりますので
各自、管理ページからコピーした内容を
そのままダブルクォーテーションの中にコピーしてください。

.env.local
NEXT_PUBLIC_CONTENTFUL_SPACE_ID="xxxxxxxxxxxxx"
NEXT_PUBLIC_CONTENTFUL_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Next.jsのローカルサーバーを起動している状態で「.env.local」を作成した場合、
ファイルを保存しても環境変数の読み込みでエラーが出る場合があります。

その際は、ローカルサーバーを一度落として、
再起動すると「.env.local」がアプリに反映されるかと思います。

次にインストールしたライブラリを使用して、
API接続用のクライアントを作成します。

utils/contentfulClient.js
import { createClient } from "contentful";

export const client = createClient({
  space: process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID,
  accessToken: process.env.NEXT_PUBLIC_CONTENTFUL_API_KEY
})

クライアントの設定ができましたら、
HomeページでuseEffect内でクライアント使用して
コンソールにデータを表示します。

pages/index.js
import Head from 'next/head'
import Image from 'next/image'
import { useEffect } from 'react'
import styles from '../styles/Home.module.css'
import { client } from '../utils/contentfulClient'

export default function Home() {

  useEffect(() => {
    (async () => {
      const res = await client.getEntries({
        content_type: 'myPosts'
      })
      console.log(res.items);
    })()

  }, [])

  return (
    <div className={styles.container}>
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main className={styles.main}>
        <h1 className={styles.title}>
          Welcome to <a href="https://nextjs.org">Next.js!</a>
        </h1>
      </main>

      <footer className={styles.footer}>
        <a
          href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
          target="_blank"
          rel="noopener noreferrer"
        >
          Powered by{' '}
          <span className={styles.logo}>
            <Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
          </span>
        </a>
      </footer>
    </div>
  )
}

Discussion