環境
Windows 64bit
言語:Node.js
PaaS:Heroku
やりたい事
Dialogflow(自然言語解析)によるユーザーの意図を汲んだbotを作成したい
参照:LINEのBot開発 超入門(後編) メッセージの内容と文脈を意識した会話を実現する
botとしての自動発信のほか、LINE Messaging APIのメッセージタイプ機能などを使いたいため、できればDialogflowのIntegrationsではなくNode.jsで動作を分岐させたく考えております。
一旦参考サイトの表記通り進めたものの、botが動作しなくなり自身で解決できず質問いたしました。
コードとエラーの内容
コードの内容(index.js)
// モジュールのインポート const server = require("express")(); const line = require("@line/bot-sdk"); // Messaging APIのSDKをインポート const dialogflow = require("dialogflow"); // ----------------------------------------------------------------------------- // パラメータ設定 const line_config = { channelAccessToken: process.env.LINE_ACCESS_TOKEN, // 環境変数からアクセストークンをセットしています channelSecret: process.env.LINE_CHANNEL_SECRET // 環境変数からChannel Secretをセットしています }; // ----------------------------------------------------------------------------- // Webサーバー設定 server.listen(process.env.PORT || 3000); // APIコールのためのクライアントインスタンスを作成 const bot = new line.Client(line_config); // Dialogflowのクライアントインスタンスを作成 const session_client = new dialogflow.SessionsClient({ project_id: process.env.GOOGLE_PROJECT_ID, credentials: { client_email: process.env.GOOGLE_CLIENT_EMAIL, private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\n/g, "\n") } }); // ----------------------------------------------------------------------------- // ルーター設定 server.post('/webhook', line.middleware(line_config), (req, res, next) => { // 先行してLINE側にステータスコード200でレスポンスする。 res.sendStatus(200); // すべてのイベント処理のプロミスを格納する配列。 let events_processed = []; // イベントオブジェクトを順次処理。 req.body.events.forEach((event) => { // この処理の対象をイベントタイプがメッセージで、かつ、テキストタイプだった場合に限定。 if (event.type == "message" && event.message.type == "text"){ events_processed.push( session_client.detectIntent({ session: session_client.sessionPath(process.env.GOOGLE_PROJECT_ID, event.source.userId), queryInput: { text: { text: event.message.text, languageCode: "ja", } } }).then((responses) => { if (responses[0].queryResult && responses[0].queryResult.action == "handle-delivery-order"){ let message_text if (responses[0].queryResult.parameters.fields.menu.stringValue){ message_text = `毎度!${responses[0].queryResult.parameters.fields.menu.stringValue}ね。どちらにお届けしましょ?`; } else { message_text = `毎度!ご注文は?`; } return bot.replyMessage(event.replyToken, { type: "text", text: message_text }); } }) ); } }); // すべてのイベント処理が終了したら何個のイベントが処理されたか出力。 Promise.all(events_processed).then( (response) => { console.log(`${response.length} event(s) processed.`); } ); });
heroku configにて環境変数[LINE_CHANNEL_ID][LINE_CHANNEL_SECRET][LINE_ACCESS_TOKEN][GOOGLE_PROJECT_ID][GOOGLE_PRIVATE_KEY][GOOGLE_CLIENT_EMAIL]に誤りがない事は確認いたしました。
エンコードはUTF-8です。
エラーの内容
2021-12-06T02:54:32.566069+00:00 app[web.1]: (node:4) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'stringValue' of undefined 2021-12-06T02:54:32.566079+00:00 app[web.1]: at /app/index.js:55:77 2021-12-06T02:54:32.566080+00:00 app[web.1]: at async Promise.all (index 0) 2021-12-06T02:54:32.566080+00:00 app[web.1]: (Use `node --trace-warnings ...` to show where the warning was created) 2021-12-06T02:54:32.566150+00:00 app[web.1]: (node:4) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) 2021-12-06T02:54:32.566208+00:00 app[web.1]: (node:4) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
stringValueが抽出されていないようなので、API連携が原因なのかと思っているのですが、初のGCPにてサービスアカウント設定などに自信がございません。
Entiesの[menu]にはvalue(松・竹・梅)が入っております。
経緯と現状
LINE公式アカウントを作成、特定の単語に反応して返信をするシンプルなbotを作成
→Herokuでデプロイし動作を確認
その後
0. 参照サイトの通りdialogflowのエージェントを作成
0. GCPで上記エージェントを内包するプロジェクトのサービスアカウントを作成
0. サービスアカウントで鍵(JSON)を作成
0. JSONを参照しHerokuの環境変数を設定
0. 上記コード(index.js)をデプロイ→botが無言botと化す
という経緯にございます。
どうしたら良いものか皆目見当もつかず、理解が浅い状態での質問にて大変恐縮ながらご教示いただけますと幸甚です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。