Airtable の公式 Node.js ライブラリ airtable の List records (select) で await async で非同期に取得するメモ

Airtable の公式 Node.js ライブラリ airtable の List records (select) で await async で非同期に取得するメモです。

背景

Airtable での Node.js のコードをお伝えするときに、await async で非同期に取得するほうが分かりやすく書けるよ~と伝えることも多いのですが、そういえば、そういう例をブログに書き残してていなかったので、まとめてみます。

image

また、Airtable 公式の API 説明ページ https://airtable.com/api でも、今回試す List records をはじめ、コールバック関数での書き方をしているので、選びがちというのもあると思います。

ベースとなる Airtable の Base

今回使うデータのかたまり Base はこちらです。 Table 1 というテーブル名で作成しています。

image

TM – WebTools テストデータ生成 でテストデータを生成しました。

準備をする

適当なフォルダを作成して、Visual Studio Code でそのフォルダをプロジェクトとして指定して作業をはじめます。

npm init -y

で npm を使えるようにして、

npm i airtable

公式の Node.js ライブラリ airtable – npm をローカルインストールします。

Airtable API のサンプルソース

REST API – Airtable で各 Base のページから List records (select) の欄を見ると、このようなサンプルソースになっています。

var Airtable = require('airtable');
var base = new Airtable({apiKey: 'YOUR_API_KEY'}).base('BASE_ID');

base('Table 1').select({
    // Selecting the first 3 records in Grid view:
    maxRecords: 3,
    view: "Grid view"
}).eachPage(function page(records, fetchNextPage) {
    // This function (`page`) will get called for each page of records.

    records.forEach(function(record) {
        console.log('Retrieved', record.get('Name'));
    });

    // To fetch the next page of records, call `fetchNextPage`.
    // If there are more records, `page` will get called again.
    // If there are no more records, `done` will get called.
    fetchNextPage();

}, function done(err) {
    if (err) { console.error(err); return; }
});

こちらの var base = new Airtable({apiKey: 'YOUR_API_KEY'}).base('BASE_ID'); を、以下の自分の設定に書き換えて今回は app.js とファイル名を設定しておきましょう。

  • YOUR_API_KEY
    • 自分のアカウントの API Key
      • アカウントページから取得できる
  • BASE_ID

その上で

node app.js

と実行すると、

Retrieved 磯貝 朋美
Retrieved 笠原 享
Retrieved 大河内 遥佳

とデータが取得できます。

このaitable ライブラリ Promise および await async にも対応

実はこの aitable ライブラリは、ちゃんと Promise および await async にも対応しています。

Airtable/airtable.js: Airtable javascript client

image

README にも言及されていて、

image

この README の先にあるリンク Release v0.5.0 · Airtable/airtable.js では、先ほどのコードで、1ページで取得できる件数を越えた場合に繰り返し取得する fetchNextPageeachPage といった部分が .all() という指定で対応していることが言及されています。

こちらのソースコードでも言及がありました。

await async で書き換えてみる

ということで書き換えてみます。

const Airtable = require('airtable');
const base = new Airtable({apiKey: 'YOUR_API_KEY'}).base('BASE_ID');

async function main (){
  // select + all で全件取得(今回は maxRecords で 3 件としているので実感ないですが)
  const records = await base('Table 1').select({
    // Selecting the first 3 records in Grid view:
    maxRecords: 3,
    view: "Grid view"
  }).all();

  // 結果表示
  records.forEach(function(record){
    console.log('Retrieved', record.get('Name'));
  });
}

main();

このように書き換えてnode app.js と実行してみると

Retrieved 磯貝 朋美
Retrieved 笠原 享
Retrieved 大河内 遥佳

と同じように結果が得られます。

エラーも検出するなら try catch も

元々のコールバックな書き方だと function done(err) { あたりでエラーも検出しているので、こちらでもエラーを検出したいときは、このようにします。

const Airtable = require('airtable');
const base = new Airtable({apiKey: 'YOUR_API_KEY'}).base('BASE_ID');

async function main (){
  let records;
  // try / catch も加える
  try {
    // select + all で全件取得(今回は maxRecords で 3 件としているので実感ないですが)
    records = await base('Table 1').select({
      // Selecting the first 3 records in Grid view:
      maxRecords: 3,
      view: "Grid view"
    }).all();
  } catch (error){
    console.log(error);
    return;
  };

  // 結果表示
  records.forEach(function(record){
    console.log('Retrieved', record.get('Name'));
  });
}

main();

このコードで例えば BASE_ID を間違えると、このように、

AirtableError {
  error: 'NOT_FOUND',
  message: 'Could not find what you are looking for',
  statusCode: 404
}

ちゃんとエラーをキャッチできます。

コールバック関数でがんばってしまうと for ループで非同期な処理を回すときなど、待ち合わせ処理や書き方に苦労することがあるので、Airtable データを await async で非同期に取得できると処理が書きやすいので重宝しています。