2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

contentful-managementでエントリーの一覧取得と新規作成をasyncでやってみる

contentful-managementでエントリーの一覧取得と新規作成をasyncでやってみる

contentful-managementのJavaScript用SDKを使ってみたので、忘れない内にメモします。

準備する

Contentfulのアカウントやスペースを作成します。作り方は、こちらの記事がわかりやすかったです。
【画像で説明】Contentfulの使い方。初期設定と各メニューについて学ぶ

Node.jsのプロジェクトに必要なパッケージをインストールします。

npm install dotenv
npm install contentful-management

package.json と同じ階層に .env ファイルを用意し、以下のように記述しておきます。

personal_access_token=パーソナルアクセストークン
space_id=対象のスペースID
environment_id=対象の環境ID。master等

パーソナルアクセストークンは、Delivery APIやPreview APIのAPI Keyとは別に、Contentful Management API専用のものを作成する必要があります。詳しい作り方は公式ページをご覧ください。
Personal Access Tokens

Contentfulからエントリー一覧を取得する

Contentfulでは、登録しているデータ1つ1つのことをエントリーと呼びます。(RDBでいうレコードに相当する単位)

エントリー一覧を取得するソースコードはこんな感じです。

// .envから環境変数として設定値を読み込む。
require('dotenv').config()
const env = process.env

// エラーが発生したときにCatchできるようにする。
process.on('unhandledRejection', console.dir);

// contentful-management用クライアントを作成する。
const contentful = require('contentful-management')
const client = contentful.createClient({
    accessToken: env.personal_access_token
});

(async () => {
    // スペースを取得する。
    const space = await client.getSpace(env.space_id);

    // 環境を取得する。
    const environment = await space.getEnvironment(env.environment_id);

    // エントリー一覧を取得する。
    const entries = await environment.getEntries();

    // エントリー一覧を表示する。
    entries.items.forEach(item => console.log(item));
})();

Contentfulへエントリーを登録する

Contentfulでは、データを保管している領域のことをコンテンツモデルと呼びます。(RDBでいうテーブルに相当する単位)

そのコンテンツモデルに対し、エントリーを新規作成してみます。まず、ドラフト(下書き)で作成し、その後パブリッシュ(公開)します。

ソースコードはこんな感じです。

fields の部分は、コンテンツモデルによって異なりますので、適宜読み替えてください。

もし、Contentfulの Settings > Localesja に変更していたら、 en-US の部分は ja に差し替えてください。

// .envから環境変数として設定値を読み込む。
require('dotenv').config()
const env = process.env

// エラーが発生したときにCatchできるようにする。
process.on('unhandledRejection', console.dir);

// contentful-management用クライアントを作成する。
const contentful = require('contentful-management')
const client = contentful.createClient({
    accessToken: env.personal_access_token
});

(async () => {
    // スペースを取得する。
    const space = await client.getSpace(env.space_id);

    // 環境を取得する。
    const environment = await space.getEnvironment(env.environment_id);

    // ドラフトでエントリーを作成する。
    const draftEntry = await environment.createEntry('hoge_content_type', {
        fields: {
            id: {
                'en-US': 'hoge_id'
            },
            name: {
                'en-US': 'hoge_name'
            }
        }
    });

    // エントリーをパブリッシュする。
    try {
        const publishedEntry = await draftEntry.publish();
        console.log(`${publishedEntry.sys.id} をパブリッシュしました。`);
    } catch (err) {
        console.error(err);
    }
})();

'hoge_content_type' はコンテンツモデルのIDです。こちらも適宜変更してください。

最後に

本記事作成にあたり、以下のページを参考にしました。わかりやすい情報ありがとうございました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?