2017-09-25 3 views
0

Je teste mon bot à partir du compte Facebook des amis car je suis incapable de trouver l'option de message sur ma page Facebook. Je suivais https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start l'erreur est la suite Im obtenir sur les journaux HerokuFB messager bot: Impossible de lire la propriété 'objet' de undefined

at=info method=POST path="/webhook" host=powerful-anchorage-25620.herokuapp.com request_id=bb2aa329-1bb5-4271-8959-074629468238 fwd="173.252.98.219" dyno=web.1 connect=2ms service=19ms status=500 bytes=404 protocol=https 
2017-09-25T07:11:21.650181+00:00 app[web.1]: TypeError: Cannot read property 'object' of undefined 
2017-09-25T07:11:21.650193+00:00 app[web.1]:  at /app/app.js:33:11 
2017-09-25T07:11:21.650195+00:00 app[web.1]:  at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 
2017-09-25T07:11:21.650196+00:00 app[web.1]:  at next (/app/node_modules/express/lib/router/route.js:137:13) 
2017-09-25T07:11:21.650197+00:00 app[web.1]:  at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) 
2017-09-25T07:11:21.650198+00:00 app[web.1]:  at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 
2017-09-25T07:11:21.650198+00:00 app[web.1]:  at /app/node_modules/express/lib/router/index.js:281:22 
2017-09-25T07:11:21.650199+00:00 app[web.1]:  at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) 
2017-09-25T07:11:21.650200+00:00 app[web.1]:  at next (/app/node_modules/express/lib/router/index.js:275:10) 
2017-09-25T07:11:21.650200+00:00 app[web.1]:  at serveStatic (/app/node_modules/serve-static/index.js:75:16) 
2017-09-25T07:11:21.650201+00:00 app[web.1]:  at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5' 

suivant est en app.js qui est hébergé en mode héroïque

var express = require('express'); 
var app = express(); 

app.set('port', (process.env.PORT || 5000)); 

app.use(express.static(__dirname + '/public')); 

// views is directory for all template files 
//app.set('views', __dirname + '/views'); 
//app.set('view engine', 'ejs'); 

app.get('/', function(request, response) { 

    console.log("Hello World"); 
    response.send("Hello World"); 
}); 

app.get('/webhook', function(req, res) { 
    if (req.query['hub.mode'] === 'subscribe' && 
     req.query['hub.verify_token'] === "test") { 
    console.log("Validating webhook"); 
    res.status(200).send(req.query['hub.challenge']); 
    } else { 
    console.error("Failed validation. Make sure the validation tokens match."); 
    res.sendStatus(403);   
    } 
}); 

app.post('/webhook', function (req, res) { 
    var data = req.body; 

    // Make sure this is a page subscription 
    if (data.object === 'page') { 

    // Iterate over each entry - there may be multiple if batched 
    data.entry.forEach(function(entry) { 
     var pageID = entry.id; 
     var timeOfEvent = entry.time; 

     // Iterate over each messaging event 
     entry.messaging.forEach(function(event) { 
     if (event.message) { 
      receivedMessage(event); 
     } else { 
      console.log("Webhook received unknown event: ", event); 
     } 
     }); 
    }); 

    // Assume all went well. 
    // 
    // You must send back a 200, within 20 seconds, to let us know 
    // you've successfully received the callback. Otherwise, the request 
    // will time out and we will keep trying to resend. 
    res.sendStatus(200); 
    } 
}); 

function receivedMessage(event) { 
    // Putting a stub for now, we'll expand it in the following steps 
    var senderID = event.sender.id; 
    var recipientID = event.recipient.id; 
    var timeOfMessage = event.timestamp; 
    var message = event.message; 

    console.log("Received message for user %d and page %d at %d with message:", 
    senderID, recipientID, timeOfMessage); 
    console.log(JSON.stringify(message)); 

    var messageId = message.mid; 

    var messageText = message.text; 
    var messageAttachments = message.attachments; 

    if (messageText) { 

    // If we receive a text message, check to see if it matches a keyword 
    // and send back the example. Otherwise, just echo the text we received. 
    switch (messageText) { 
     case 'generic': 
     sendGenericMessage(senderID); 
     break; 

     default: 
     sendTextMessage(senderID, messageText); 
    } 
    } else if (messageAttachments) { 
    sendTextMessage(senderID, "Message with attachment received"); 
    } 
} 

function sendTextMessage(recipientId, messageText) { 
    var messageData = { 
    recipient: { 
     id: recipientId 
    }, 
    message: { 
     text: messageText 
    } 
    }; 

    callSendAPI(messageData); 
} 

function callSendAPI(messageData) { 
    request({ 
    uri: 'https://graph.facebook.com/v2.6/me/messages', 
    qs: { access_token: PAGE_ACCESS_TOKEN }, 
    method: 'POST', 
    json: messageData 

    }, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     var recipientId = body.recipient_id; 
     var messageId = body.message_id; 

     console.log("Successfully sent generic message with id %s to recipient %s", 
     messageId, recipientId); 
    } else { 
     console.error("Unable to send message."); 
     console.error(response); 
     console.error(error); 
    } 
    }); 
} 

function sendGenericMessage(recipientId, messageText) { 
    // To be expanded in later sections 
} 

app.listen(app.get('port'), function() { 
    console.log('Node app is running on port', app.get('port')); 
}); 

bien vouloir me faire savoir où je vais mal.

Merci.

Répondre

0

Il semble que vous ayez besoin du module body-parser, donc le req n'est pas analysé correctement. Remplacer les deux premières lignes avec ceci:

const 
    express = require('express'), 
    bodyParser = require('body-parser'); 

let app = express(); 
app.use(bodyParser.urlencoded({"extended": false})); 
app.use(bodyParser.json()); 
+0

A travaillé parfaitement. Merci d'avoir répondu. :) –