LoginSignup
4
2

LINE Botの開発の際のエラーをいい感じに出したい

Last updated at Posted at 2023-06-04

Node.jsでLINE Botを作る時は以下のSDKを使うのが一般的になってると思います。

こちらのSDKでLINE Bot開発をしている際の話になります。

LINE Botのエラーどこ見れば良いのか分かりにくい

LINE Botのエラーといっても色々ありますが、APIリクエストの際のHTTPエラー周りがメインになります。

以下のようにログが色々と出て、どこが肝心のエラーメッセージなのか分かりにくいですよね。

これを見やすくしたいと思います。

まずはエラーを出すコード

以下のLINE Botはユーザーの発言をオウム返ししますが、一つの発言に対して複数返してくるウザい感じのBotです。

イメージ

LINE Messaging APIの仕様上5つまでしか返答できません が、以下のコードだと6つのメッセージを返そうとしていてエラーになります。

app.js
'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リクエストでのエラーメッセージを見たい時には良さそうです。

補足

以下の記事にこの辺の話が載ってました。参考にさせていただきました。

参考: https://dev.classmethod.jp/articles/line-bot-sdk-nodejs-error-messages/

このLINE Bot SDKのAPIリクエストはaxiosに依存しているみたいです。

axiosを利用する他のコードでも同じような指定ができるかもしれません。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2