Node.jsでLINE Botを作る時は以下のSDKを使うのが一般的になってると思います。
こちらのSDKでLINE Bot開発をしている際の話になります。
LINE Botのエラーどこ見れば良いのか分かりにくい
LINE Botのエラーといっても色々ありますが、APIリクエストの際のHTTPエラー周りがメインになります。
以下のようにログが色々と出て、どこが肝心のエラーメッセージなのか分かりにくいですよね。
これを見やすくしたいと思います。
まずはエラーを出すコード
以下のLINE Botはユーザーの発言をオウム返ししますが、一つの発言に対して複数返してくるウザい感じのBotです。
イメージ
LINE Messaging APIの仕様上5つまでしか返答できません が、以下のコードだと6つのメッセージを返そうとしていてエラーになります。
'use strict';
const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;
const config = {
channelSecret: 'チャンネルシークレット',
channelAccessToken: 'アクセストークン'
};
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
console.log(req.body.events);
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result))
.catch((err) => {
console.error(err);
res.status(500).end();
});
});
const client = new line.Client(config);
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
const message = {
type: 'text',
text: event.message.text //実際に返信の言葉を入れる箇所
};
//APIの仕様的にエラーがでる箇所 6つ指定している
return client.replyMessage(event.replyToken, [message, message, message, message, message, message]);
}
app.listen(PORT);
console.log(`Server running at ${PORT}`);
プログラムを実行して、ユーザーがBOTに話しかけるとエラーが起きてエラーオブジェクトの情報がターミナルにたくさん出てきます。
ちなみにここが該当箇所になります。
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result))
.catch((err) => {
console.error(err); //←ココ
res.status(500).end();
});
参考として、こちらの記事のコードを使っています。(以前は記事内に.catch
部分がなかったので更新しました。)
err.originalError.response.dataでメッセージだけいい感じに出せた
console.error(err.originalError.response.data);
という指定にすることでエラーがスッキリします。
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result))
.catch((err) => {
console.error(err.originalError.response.data); //←ココ
res.status(500).end();
});
同じようにエラーを出してみると出力が以下のようになりました。
{
message: 'The request body has 1 error(s)',
details: [ { message: 'Size must be between 1 and 5', property: 'messages' } ]
}
このSize must be between 1 and 5
が仕様的に1個〜5個のメッセージしか返せないというエラー内容になってきます。今回はなぜでエラーが起きてるか把握しながらやってましたが、意図しないエラーが起きた時にエラーメッセージがすぐに分かるのは地味に嬉しいです。
まとめ
逆にヘッダー部分がどうなってるかなどの詳細は表示されなくなるので注意が必要ですが、取り急ぎAPIリクエストでのエラーメッセージを見たい時には良さそうです。
LINE Bot SDKからのリクエストはaxiosを使ってるっぽい
— 菅原のびすけ (プロトアウト9期募集中) (@n0bisuke) June 3, 2023
console.error(https://t.co/pyNucjVBeF);でエラーとれるぽい
> https://t.co/1Y50iCZdT1
> https://t.co/MwkQAJS9QD#linedc #protoout
補足
以下の記事にこの辺の話が載ってました。参考にさせていただきました。
参考: https://dev.classmethod.jp/articles/line-bot-sdk-nodejs-error-messages/
このLINE Bot SDKのAPIリクエストはaxiosに依存しているみたいです。
axiosを利用する他のコードでも同じような指定ができるかもしれません。