実現したいこと
LINE Botを作成中です。
クライアントのメッセージに対して返答ができるようにしたい。
コードの構成
src
ディレクトリに記載して、コンパイルしたコードをnode_modules
と一緒にS3経由でLambdaにアップロードしています。
. ├── api/ │ ├── dist/(コンパイル後) │ ├── src/(コンパイル前) │ │ ├── Common/ │ │ │ └── Template │ │ │ │ └── ErrorMessage.ts │ │ │ └── Send │ │ │ │ └── SendErrorMessage.ts │ │ └── index.ts
設定
Lambda
Node.js 14.xを使用しています。
コード
index.ts
// パッケージのインストール import { ClientConfig, Client, WebhookEvent } from '@line/bot-sdk'; // モジュールを読み込む import { SendErrorMessage } from './Common/Send/SendErrorMessage'; // アクセストークンとチャンネルシークレットをenvから読み込む const clientConfig: ClientConfig = { channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || '', channelSecret: process.env.CHANNEL_SECRET || '', }; // インスタンス化 const client: Client = new Client(clientConfig); // 実行 exports.handler = async (event: any, context: any) => { const body: any = JSON.parse(event.body); const events: WebhookEvent[] = body.events; events.map( async (event: WebhookEvent): Promise<void> => { try { console.log('event: ' + JSON.stringify(event)); await SendErrorMessage(client, event); } catch (err) { console.log(err); } } ); };
Common/Template/ErrorMessage.ts
// パッケージを読み込む import { TextMessage } from '@line/bot-sdk'; export const ErrorMessageTemplate = (): Promise<TextMessage> => { const params: TextMessage = { type: 'text', text: 'ごめんなさい、このメッセージは対応していません。', }; return new Promise((resolve, reject) => { resolve(params); }); };
Common/Send/SendErrorMessage.ts
// パッケージを読み込む import { Client, WebhookEvent } from '@line/bot-sdk'; // モジュールを読み込む import { ErrorMessageTemplate } from '../Template/ErrorMessageTemplate'; export const SendButtonMessageOrErrorMessage = async ( client: Client, event: WebhookEvent ): Promise<void> => { try { if (event.type !== 'message' || event.message.type !== 'text') { return; } const { replyToken } = event; const { text } = event.message; const errorMessageTemplate = await ErrorMessageTemplate(); console.log('errorMessageTemplate: ' + JSON.stringify(errorMessageTemplate)); await client.replyMessage(replyToken, errorMessageTemplate); } catch (err) { console.log(err); } };
確認したこと
console.log('errorMessageTemplate: ' + JSON.stringify(errorMessageTemplate));のログ検証
CloudWatchで以下のメッセージが返ってきていることを確認しています。
errorMessageTemplate: { "type": "text", "text": "ごめんなさい、このメッセージは対応していません。" }
LINEのNode.jsのパッケージが以下です。
https://line.github.io/line-bot-sdk-nodejs/getting-started/basic-usage.html#synopsis
上記で、このように書かれています。
client.replyMessage(event.replyToken, { type: 'text', text: event.message.text });
メッセージが正しく取得できているので、こちらのコードも正しく動くだろうと考えました。
await client.replyMessage(replyToken, errorMessageTemplate);
try, catchで書いているのでエラーのログも書いてあるかなと確認しましたがありませんでした。
気になること
Promiseで渡さないと値を受け取れないのでしょうか?
Common/Template/ErrorMessage.ts
のコードも最初は、以下のようにしていました。
// Load the package import { TextMessage } from '@line/bot-sdk'; export const ErrorMessageTemplate = (): TextMessage => { return { type: 'text', text: 'ごめんなさい、このメッセージは対応していません。', }; };
ただこれでは、returnの内容が返ってこなかったのでPromiseで書き換えました。
しかし、今回は同様に非同期のasync/awaitで書いており、Node14なので対応していると思うのですがうまくいきません。
原因とコードをどのように直すべきなのかアドバイスいただけますと幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/21 07:53