2.x マイグレーションガイド
@slack/bolt@1.x
End of life は 2021 年 4 月 30 日 の予定です。この日からは @slack/bolt@1.x
の開発は完全に終了となり、残っている open issue や pull request もクローズされます。
このガイドは Bolt 1.x を利用しているアプリを 2.x にアップグレードするための手順について説明します。いくつかの変更が必要とはなりますが、ほとんどのアプリの場合で、おそらく対応に必要な時間は 5 〜 15 分程度です。
リスナー関数を async
関数に変更
Bolt アプリ内のリスナー関数は、全て async
関数に変更する必要があります。そして、そのリスナー関数内の say()
、respond()
、ack()
メソッドの呼び出しも全て await
を呼び出しの前につける必要があります。
これまで:
app.action('some-action-id', ({action, ack, say}) => {
ack();
say('hello world');
})
これから:
app.action('some-action-id', async ({action, ack, say}) => {
await ack();
await say('hello world');
})
エラーハンドリング
Bolt for JavaScript 2.x では、より多くのユースケースで、必要に応じてエラーをキャッチし、グローバルエラーハンドラーにそれを送るかを制御できるよう改善されました。これまでと同様、グローバルエラーハンドラーに全て任せるよりは、可能な限り、リスナー関数の内部でエラーに対処することをおすすめします。
リスナー関数内で try
/catch
節を用いたエラーハンドリング
app.action('some-action-id', async ({action, ack, say, logger}) => {
try {
await ack();
await say('hello world');
} catch (error) {
// ここでエラーに対処
logger.error(error);
}
})
グローバルエラーハンドラーによるエラーハンドリング
app.error(async (error) => {
// エラーの詳細をチェックして、メッセージ送信のリトライやアプリの停止などの対処を行う
console.error(error);
});
その他のエラーに関する変更:
- リスナー関数が
ack()
メソッドを 3 秒間のうちに呼び出さなかった場合、これまでのように例外を投げるのではなくログを出力するようになりました - もし一つのイベントに対して複数のリスナー関数を実行中に複数のエラーが発生した場合、Bolt for JavaScript は
ErrorCode.MultipleListenerError
の値でのcode
と、発生した個々のエラーの配列を含むoriginals
というパラメーターをラップしたエラーを返します
メッセージショートカット
メッセージショートカット (以前はメッセージアクションと呼ばれていました)は、これまで action()
メソッドでハンドリングしていましたが shortcut()
メソッドを使うようになりました。
これまで:
app.action({ callback_id: 'message-action-callback' }, ({action, ack, context}) => {
ack();
// ここで処理を行う
})
これから:
app.shortcut('message-action-callback', async ({shortcut, ack, context}) => {
await ack();
// ここで処理を行う
})
ミドルウェアに関する変更
もしカスタムのミドルウェアを書いている場合は、その関数を async
に変更し、さらに next()
の呼び出しを await next()
に変更してください。もし後続の処理がある場合は、関数を next()
に渡す代わりに、その後続の処理を await next()
の後に実行してください。
これまで:
function noBotMessages({message, next }) {
function doAfter() {
// 後続の処理をここでやる
}
if (!message.subtype || message.subtype !== 'bot_message') {
next(doAfter);
}
}
これから:
async function noBotMessages({message, next }) {
if (!message.subtype || message.subtype !== 'bot_message') {
await next();
// 後続の処理をここでやる
}
}
TypeScript の最低必須バージョン
TypeScript 利用ガイド でも説明していますが、@slack/bolt@2.x
は TypeScript 3.7 以上が必須バージョンで す。