Node.js環境でのREST API Clientの便利な使い方【kintone】

#kintone#Node.js#JavaScript#TypeScript公開 2022-10-23
記事のトップ画像

kintone で JavaScript カスタマイズを利用する場合、組み込む JavaScript を直接記述することもできますが、Node.js を活用することで、kintone で利用できる様々なモジュールを使用することができます。

@kintone/rest-api-clientもその一つで、サイボウズ株式会社が公式に開発している、REST API を使いやすくするためのモジュールです。

今回は REST API Client を活用するうえで、私が注意しているポイントを紹介します。

シングルトンで使う

REST API Client を使用する際、以下のようにクラスをモジュールからインポートし、新しいインスタンスを作成して利用します。

import { KintoneRestAPIClient } from '@kintone/rest-api-client';

const client = new KintoneRestAPIClient({
  baseUrl: https://xxxxxxxx.cybozu.com,
  auth: {
    username: xxxxxxxxxxxx,
    password: xxxxxxxxxxxx,
  },
});

const response = await client.record.getAllRecordsWithCursor({ app: 16 });

ただ実装したい機能の中で、複数のアプリから繰り返しレコードを取得や更新したい場合もあるかと思います。

API トークンを使用する場合はアプリの数だけインスタンスを作成する必要がありますが、パスワードを使用する場合、インスタンスをシングルトンとして定義しておく方法が使いやすいです。

kintone-api-client.jsのようなファイルを 1 つ作成し、インスタンスをエクスポートするコードだけ記述します。

dotenvで環境変数を定義しておくと便利だと思います。

import { KintoneRestAPIClient } from '@kintone/rest-api-client';

// ユーザー名とパスワードを使用する場合
export const kintoneClient = new KintoneRestAPIClient({
  baseUrl: process.env.KINTONE_BASE_URL,
  auth: {
    username: process.env.KINTONE_USERNAME,
    password: process.env.KINTONE_PASSWORD,
  },
});

// APIトークンを活用する場合
export const kintoneClient = new KintoneRestAPIClient({
  baseUrl: process.env.KINTONE_BASE_URL,
  auth: { apiToken: process.env.KINTONE_API_TOKEN },
});

実際に使う際に、先ほど定義したファイルからインスタンスをインポートします。

import { kintoneClient } from './kintone-api-client';

const response = await kintoneClient.record.getAllRecordsWithCursor({ app: 16 });

ゲストスペースに対応する

kintone REST API はゲストスペースにも対応しており、コンストラクタの引数にguestSpaceIdを指定することで、対象ゲストスペースにアクセスできます。

あくまで実行される場所がゲストスペースであることが前提ですが、ゲストスペースを自動判定する方法を紹介します。

caution

自動判定ロジックは公式に提供されているものではないため、アップデートにより動作しなくなる可能性があります。

TypeScript で記述していますが、JavaScript の場合はConstructorParameters<typeof KintoneRestAPIClient>を削除してください。

import { KintoneRestAPIClient } from '@kintone/rest-api-client';

class FlexKintone extends KintoneRestAPIClient {
  constructor(...options: ConstructorParameters<typeof KintoneRestAPIClient>) {
    const url = kintone.api.url('/k/v1/app', true);
    const found = url.match(/k\/guest\/([0-9]+)\//);

    if (found && found.length > 1) {
      super({
        guestSpaceId: found[1],
        ...(options[0] || {}),
      });
      return;
    }

    super(...options);
  }
}
Ribbit's works