質問編集履歴

1 新たに試したことを追加

bes-how

bes-how score 10

2018/11/07 15:40  投稿

messenger botにて、entry.messaging がundefinedになってしまう
### 前提・実現したいこと
facebook messanger bot で、ようこそ画面でのスタートボタンを押したときのpostbackで、ボタンを含んだメッセージを送りたいです。
### 発生している問題・エラーメッセージ
```
TypeError: Cannot read property 'forEach' of undefined
```
### 該当のソースコード
```node.js
'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 のままです。
一体これはどういう現象なんでしょうか…
  • Facebook Graph API

    161 questions

    Facebook Graph APIとは Facebookのグラフデータベース用のAPIであり、対応言語はPHP、Perl、ActionScript、JavaScriptなどがあります。

  • Node.js

    3906 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る