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

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

ただいまの
回答率

88.63%

messenger botにて、entry.messaging がundefinedになってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 779

bes-how

score 10

 前提・実現したいこと

facebook messanger bot で、ようこそ画面でのスタートボタンを押したときのpostbackで、ボタンを含んだメッセージを送りたいです。

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

TypeError: Cannot read property 'forEach' of undefined 

 該当のソースコード

'use strict';
const PAGE_ACCESS_TOKEN = process.env.PAGE_ACCESS_TOKEN;
// Imports dependencies and set up http server
const 
request = require('request'),
                express = require('express'),
                body_parser = require('body-parser'),
                app = express().use(body_parser.json()); // creates express http server

// Sets server port and logs message on success
app.listen(process.env.PORT || 1337, () => console.log('webhook is listening'));

// Accepts POST requests at /webhook endpoint
app.post('/webhook', (req, res) => {  

                // Parse the request body from the POST
                let body = req.body;

                // Check the webhook event is from a Page subscription
                if (body.object === 'page') {

                                body.entry.forEach(function(entry) {

                                                entry.messaging.forEach(function(event) { // ここでmessagingがundefinedになる
                                                // Get the sender PSID
                                                let sender_psid = event.sender.id;
                                                console.log('Sender ID: ' + sender_psid);

                                                                if (event.postback) {
                                                                                handlePostback(event);
                                                                }
                                                });

                                });
                                                // Return a '200 OK' response to all events
                                                res.status(200).send('EVENT_RECEIVED');

                                } else {
                                                // Return a '404 Not Found' if event is not from a page subscription
                                                res.sendStatus(404);
                                }

});

                                // Accepts GET requests at the /webhook endpoint
                                app.get('/webhook', (req, res) => {

                                                /** UPDATE YOUR VERIFY TOKEN **/
                                                const VERIFY_TOKEN = "alcyone0225";

                                                // Parse params from the webhook verification request
                                                let mode = req.query['hub.mode'];
                                                let token = req.query['hub.verify_token'];
                                                let challenge = req.query['hub.challenge'];

                                                // Check if a token and mode were sent
                                                if (mode && token) {

                                                                // Check the mode and token sent are correct
                                                                if (mode === 'subscribe' && token === VERIFY_TOKEN) {

                                                                                // Respond with 200 OK and challenge token from the request
                                                                                console.log('WEBHOOK_VERIFIED');
                                                                                res.status(200).send(challenge);

                                                                } else {
                                                                                // Responds with '403 Forbidden' if verify tokens do not match
                                                                                res.sendStatus(403);      
                                                                }
                                                }
                                });

                                function callSendAPI(sender_psid, response) {
                                                // Construct the message body
                                                let request_body = {
                                                                "recipient": {
                                                                                "id": sender_psid
                                                                },
                                                                "message": response
                                                }

                                                // Send the HTTP request to the Messenger Platform
                                                request({
                                                                "uri": "https://graph.facebook.com/v3.2/me/messages",
                                                                "qs": { "access_token": PAGE_ACCESS_TOKEN },
                                                                "method": "POST",
                                                                "json": request_body
                                                }, (err, res, body) => {
                                                                if (!err) {
                                                                                console.log('message sent!')
                                                                } else {
                                                                                console.error("Unable to send message:" + err);

                                                                }
                                                }); 
                                }

                                function handlePostback(event) {
                                                let senderId = event.sender.id;
                                                let payload = event.postback.payload;

                                                if (payload === "Greeting") {
                                                let messageData = { 
                                                                "message":{
                                                                                "attachment":{
                                                                                                "type":"template",
                                                                                                "payload": {
                                                                                                                "template_type":"button",
                                                                                                                "text":"何の教科がわからないのか教えてください! 一番始めに戻りたいときは はじめ と入力してください!",
                                                                                                                "buttons":[{
                                                                                                                                "type":"postback",
                                                                                                                                "title":"英語",
                                                                                                                                "payload":"English"
                                                                                                                }]
                                                                                                }
                                                                                }
                                                                }
                                                }
                                                callSendAPI(senderId, messageData);
                                                }
                                }

 試したこと

はじめは公式のドキュメントのようにwebhook_event を定義して、それにentry.messagint[0] を代入していたが、こちらでも

Type error: cannot read property '0' of undefined

のようなエラーが出ていたので、messaging が正しく定義されていない…?
すみません、教えてください…

追記
ボタンテンプレートのところ(handlePostbackのmessageData)を

"text":"任意のテキスト"


に変更したら、しっかり任意のテキストが送信されました。
ですが、依然としてmessagingはundefined のままです。
一体これはどういう現象なんでしょうか…

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

cannot read property の件は解決していませんが、ボタン付きのメッセージを送る方法はわかりました!

function callSendAPI(sender_psid, response) {
                                                // Construct the message body
                                                let request_body = {
                                                                "recipient": {
                                                                                "id": sender_psid
                                                                },
                                                                "message": response
                                                }

                                                // Send the HTTP request to the Messenger Platform
                                                request({
                                                                "uri": "https://graph.facebook.com/v3.2/me/messages",
                                                                "qs": { "access_token": PAGE_ACCESS_TOKEN },
                                                                "method": "POST",
                                                                "json": request_body
                                                }, (err, res, body) => {
                                                                if (!err) {
                                                                                console.log('message sent!')
                                                                } else {
                                                                                console.error("Unable to send message:" + err);

                                                                }
                                                }); 
                                }

でもうmessageがあるのに、送るところでもmessageを定義していて

"message": {
    "message": {
......
    }
}

のようになっているのが原因でした…
あと少しで挫折するところだった…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る