2017-06-20 14 views
0

私はFirebaseのためのクラウド機能にフックFacebookのチャットロボットを開発しています。クラウド機能:HTTPトリガー - 約束/非同期

擬似コード:

  1. 受信したユーザメッセージ
  2. 確認することが有効なURLであれば
  3. (ノードライブラリread-artを使用して)URLからコンテンツ/記事+ HTMLを取得ストアがデータFirebaseデータベース
  4. ユーザーに返信(Facebookのメッセージ)

私はすべて5部を書いて、個別にすべての部品をテストしたが、私はそれらのすべてを連鎖の問題を抱えています。私はいくつかの質問をしたいと思います。

  1. 私はresponse.sendStatus(200);に電話する必要がありますか。 firebase機能は、私がresponse.sendStatus(200);と呼ばれた直後に終了していますか? (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プロミス(あなたFirebaseプッシュ)を返さなければならない、すなわちreceivedMessageこの関数の呼び出し側は約束を処理する必要がありますextractContentAndSaveから受信したすべてのケースでの約束を返す必要があります。

そして、最後にmessengerWebhookreceivedMessageによって返された約束を処理する必要があります。あなたは、あなたのアーキテクチャのトップ機能まで必ずご約束バブルをしなければなりません。

+0

私は、 'read-art'がプロモートコールバックを提供していることを知りました。私は連鎖して、今はすべて動作します。ありがとう。 –

関連する問題