経緯
問題発生
slack からイベントが発行されて 3 秒以内に返さないとリトライされてしまうという仕様により、同じ返信を複数回実行してしまう状態になりました。
試行錯誤をしたが、結局自前で用意した Express でリクエストを捌くという強引な方法で強引に乗り切りました。
開発者に解決方法を教えてもらう
上記の記事を twitter に投稿したところ、Bolt.js 開発者の方が解決方法を教えてくれました!ありがとうございました!
比較的最近追加された機能でドキュメントにちゃんと書いてないのが申し訳ないのですが customPropertiesExtractor というのを使えば request header も context に渡せます。 https://t.co/YVJW8vnvAp #SlackDevJP
— Kazuhiro Sera (瀬良) (@seratch_ja) June 6, 2022
結論
import { App } from "@slack/bolt";
import { shouldSkip } from "./shouldSkip"
// アプリの設定など
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET
});
// global middleware。すべての event action command の前に実行される。
app.use(async (args) => {
const { context, next } = args;
// リトライされたイベントであればスキップすべきかどうか判断する
if (context.retryNum && shouldSkip(contenxt)) {
return;
}
await next();
})
// 処理
app.event("message", async ({ say }) => {
say("Hello world!");
});
(async () => {
await app.start(8080);
console.log("⚡️ Bolt app is running!");
})();
bolt.js の API だけを使ってリクエストを上手く処理することができました!