2017-09-25 89 views
0

我从朋友的Facebook帐户测试我的机器人,因为我无法在我的Facebook页面上找到消息选项。我下面 https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start 以下是错误林在Heroku日志FB messenger bot:无法读取未定义的属性'object'

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' 

获得以下是其中托管在英雄

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')); 
}); 

请让我知道我要去哪里错了app.js。

谢谢。

回答

0

看起来你需要body-parser模块,所以req没有被正确解析。用这个替换前两行:

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

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

完美工作。感谢你的回答。 :) –

相关问题