我正在开发一个Facebook聊天机器人,它连接到Cloud Functions for Firebase .
伪代码:
-
收到用户留言
-
检查这是否是有效的URL
-
从URL中检索内容/文章html(使用节点库
read-art
) -
将数据存储到Firebase数据库
-
向用户发送回复(Facebook消息)
我写了所有5个零件并分别测试了所有零件,但是我把所有零件链接起来都有问题 . 我想问几个问题 .
-
我/何时应该拨打
response.sendStatus(200);
?我打电话给response.sendStatus(200);
后,firebase功能是否终止? (根据firebase doc,答案似乎是肯定的) . 所以我试着将这一行放在promise
块中,firebase在日志文件中提示timeout
消息 -
任何解决问题的建议?我应该如何构建我的功能?
exports.messengerWebhook = functions.https.onRequest((request, response) => {
var data = request.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);
}
});
});
response.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 (validUrl.isHttpUri(messageText) || validUrl.isHttpsUri(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":
extractContentAndSave(messageText);
break;
default:
sendTextMessage(senderID, messageText);
}
} else {
sendTextMessage(senderID, "This is not a url");
}
}
function extractContentAndSave(url) {
read(url, function(err, art, options, resp) {
if (err) {
throw err;
}
var title = art.title, // title of article
content = art.content, // content of article
html = art.html; // whole original innerHTML
admin
.database()
.ref("webpage")
.push({
url: url,
title: title,
content: content,
rawHtml: html
//cachedPageUrl:
})
.then(
{
//Send response to user via Facebook Messenger
}
);
console.log("[STATUS CODE]", resp && resp.statusCode);
// sendTextMessage(senderID, title);
});
}
1 回答
我没有时间来修改你的代码)但正如你所说的,你应该只在所有事情完成之后调用
response.sendStatus(200);
,我所说的一切都意味着你开始的每一个Promise都已完成 .所以你的函数
extractContentAndSave
必须返回一个Promise(你的Firebase推送),这个函数的调用者,即receivedMessage
必须处理从extractContentAndSave
收到的Promise,并且在每种情况下都应该返回一个Promise .最后
messengerWebhook
必须处理receivedMessage
返回的Promise . 您必须确保您的承诺成为您架构的顶级功能 .