2017-06-20 69 views
0

我正在開發一個Facebook聊天漫遊器,它與Firebase的雲端函數相關聯。Firebase的雲端函數:HTTP觸發器 - Promise/Async

僞代碼:

  1. 收到的用戶消息
  2. 檢查,如果這是
  3. 檢索來自URL內容/文章+ HTML(使用節點庫read-art
  4. 存儲有數據的有效網址到Firebase數據庫
  5. 發送回覆給用戶(Facebook消息)

我寫了所有5個部件,並單獨測試了所有部件,但是我有問題將所有部件鏈接起來。我想問幾個問題。

  1. 哪裏/何時應該撥打response.sendStatus(200);?我稱爲response.sendStatus(200);後,Firebase功能是否被終止? (根據firebase文檔,答案似乎是肯定的)。所以我試圖把這一行放在promise塊內,並且firebase提示timeout消息在日誌文件中

  2. 有沒有解決問題的建議?我應該如何構建我的功能?


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

回答

0

我不知道這是否有資格作爲一個答案(因爲我沒有任何時間去修改代碼),但如你所說,你應該只調用response.sendStatus(200);後一切所做的一切,我的意思是說,你開始的每一個承諾都完成了。

所以你的函數extractContentAndSave必須返回一個承諾(你的火力地堡推),此功能即receivedMessage必須處理來自extractContentAndSave,並在任何情況下應該返回一個承諾收到承諾的來電。

而最後messengerWebhook必須處理由receivedMessage返回的承諾。您必須確保您的承諾能夠發揮您架構的最高功能。

+0

我剛剛發現,然後'讀藝術'提供Promoise回調,我鏈接,現在一切正常。謝謝。 –

相關問題