我正在从朋友的Facebook帐户测试我的机器人,因为我无法在我的Facebook页面上找到消息选项。我跟着 https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start 以下是我在Heroku Logs上的错误
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'
以下是在Heroic
上托管的app.jsvar 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'));
});
请告诉我哪里出错了。
感谢。
答案 0 :(得分: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());