首页 文章

Firebase的 Cloud 功能:HTTP触发器 - Promise / Async

提问于
浏览
0

我正在开发一个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 回答

  • 0

    我没有时间来修改你的代码)但正如你所说的,你应该只在所有事情完成之后调用 response.sendStatus(200); ,我所说的一切都意味着你开始的每一个Promise都已完成 .

    所以你的函数 extractContentAndSave 必须返回一个Promise(你的Firebase推送),这个函数的调用者,即 receivedMessage 必须处理从 extractContentAndSave 收到的Promise,并且在每种情况下都应该返回一个Promise .

    最后 messengerWebhook 必须处理 receivedMessage 返回的Promise . 您必须确保您的承诺成为您架构的顶级功能 .

相关问题