質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1119閲覧

TypeError: Cannot read property 'parameters' of undefined

yanasan

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/05/15 01:01

前提・実現したいこと

プログラム初心者です。

Dailogflowに質問してWebhookを使いCloudFunctionで回答分岐させDialogflow上に回答を表示させたいと思っています。下記のページと同じ手順で作業していたのですがTypeError: Cannot read property 'parameters' of undefinedと出て困っています。
お手数ですが教えていただけると大変助かります。
参考にしたページ:
https://www.apps-gcp.com/dialogflow-cloud-function-chatbot/

発生している問題・エラーメッセージ

TypeError: Cannot read property 'parameters' of undefined

該当のソースコード

//index.js exports.chatbottest = function chatbottest(req, res) { let mes; if(!req.body.result.parameters.boardgame){ mes = "パンデミック、アグリコラ、カタンについてお答えできます。"; } else if(req.body.result.parameters.boardgame == "パンデミック"){ mes = "病原体から世界を救うボードゲームです"; } else if(req.body.result.parameters.boardgame == "アグリコラ"){ mes = "荒れ果てた土地で豊かな農場を作るゲームです"; } else if(req.body.result.parameters.boardgame == "カタン"){ mes = "未開拓のカタン島で部族を栄えさせるゲームです"; } else{ mes = "すいません、知らないボードゲームです"; } res.setHeader('Content-Type', 'application/json'); res.send(JSON.stringify({"speech": mes, "displayText": mes})); };
{ //package.json "name": "sample-http", "version": "0.0.1" }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

req.body.result.parameters.boardgame

req.body.result が undefined であるためエラーが発生しています。
エラーが発生した場合は、固有名詞を取り除いた状態「TypeError: Cannot read property of undefined」などで検索をかけると原因が詳細に書かれたサイトが見つかると思います。

---追記---
req.body.result は Dialogflow から渡ってくる引数になります。
Dialogflow から渡ってきている引数が間違っているのか、Google Cloud functions 側の設定が間違っているのか切り分けが必要になります。

まずは、引数が正しくわたってきているのか、req の中身を確認してください。
中身が入っている場合、Dialogflowの戻り値の形式が変わっているのだと思います。

---再追記---
Dialogflow が返す値の形式に変更が入っているようです。

Dialogflow Webhook Format
v1 : https://developers.google.com/actions/reference/v1/dialogflow-webhook
v2(現行) : https://developers.google.com/actions/build/json/dialogflow-webhook-json

v1の時は 「req.body.result」で取れたものが、v2では「req.body.queryResult」となっているようです。
req.body.result.parameters.boardgame の部分を
req.body.queryResult.parameters.boardgame と変更すれば、値がとれるのではないかと思います。

投稿2019/05/15 01:16

編集2019/05/15 05:58
mar-kn

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yanasan

2019/05/15 01:33

回答ありがとうございます。 この場合ですとreq.body.resultをしっかりと定義してあげないといけないということでしょうか? もし認識違いがあればお手数ですが教えていただけると大変助かります。 無学で申し訳ありません。 よろしくお願いいたします。
yanasan

2019/05/15 06:48

事細かく教えていただきありがとうございます。 やっぱり形式に変更があったのですね。 教えていただいたとおりにやってみようと思います。
yanasan

2019/05/22 01:32

できましたー ありがとうございます!
guest

0

データが不定というならともかく自分でオブジェクトを設計しているのであれば
あまりくどいチェックは不要なはずですがちゃんとチェックするならこう

javascript

1if(typeof req!=="undefined" && 2 req.body && 3 req.body.result && 4 req.body.result.parameters){ 5 if(req.body.result.parameters.boardgame == "パンデミック"){ 6 mes = "パンデミック、アグリコラ、カタンについてお答えできます。"; 7 }else if(){ 8 ・・・; 9 } 10}

つまりreqが定義されていればreq.bodyを参照してもエラーにはなりませんが
req.bodyが定義されていなければreq.body.resultはエラーになります

全部すっとばしてtry-catchする手もありますが
問題点の所在をわからなくしてしまう可能性はありますので
おすすめはしません

javascript

1try{ 2 if(req.body.result.parameters.boardgame == "パンデミック"){ 3 mes = "パンデミック、アグリコラ、カタンについてお答えできます。"; 4 }else if(){ 5 ・・・; 6 } 7}catch(e){ 8 mes = "病原体から世界を救うボードゲームです"; 9}

投稿2019/05/15 02:05

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問