2017-08-17 48 views
2

我有一個Android應用程序發送POST請求到HTTP觸發的雲功能的功能。每當我點擊一次按鈕發送消息時,Firebase都會在Firebase控制檯上註冊兩次事件。我的應用程序的構建方式是在第一次單擊後發送消息的按鈕消失,所以我不會無意中雙擊該按鈕,並且當我逐步調試器時,僅發送調用POST請求的函數一旦。你們能幫我嗎?我對Firebase知之甚少,無法找到很好的文檔或其他類似的問題。爲什麼使用Android HTTP請求觸發器多次調用此Cloud Function?

下面是其中將消息發送到我的FCM雲功能的方法:

public void sendPushToSingleInstance(final Context activity, final String message, final String myId, final String theirId) { 

    final String url = URL_TO_CLOUD_FUNCTION; 

    StringRequest myReq = new StringRequest(Request.Method.POST, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        Toast.makeText(activity, "Success", Toast.LENGTH_SHORT).show(); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        if (error.networkResponse != null) 
         Toast.makeText(activity, String.valueOf(error.networkResponse.statusCode), Toast.LENGTH_SHORT).show(); 
        else 
         Toast.makeText(activity, "some error", Toast.LENGTH_SHORT).show(); 
       } 
      }) { 

     @Override 
     public byte[] getBody() throws com.android.volley.AuthFailureError { 
      Map<String, String> rawParameters = new Hashtable<String, String>(); 

      //not used 

      return new JSONObject(rawParameters).toString().getBytes(); 
     }; 

     public String getBodyContentType() { 
      return "application/json; charset=utf-8"; 
     } 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 

      headers.put("from", myId); 
      headers.put("message", message); 
      headers.put("sendingTo", theirId); 

      return headers; 
     } 
    }; 

    Volley.newRequestQueue(activity).add(myReq); 
} 

我的JavaScript採取HTTP請求,削減它,併發送郵件到包含其他用戶的ID的主題(我做意思是做這個經文發送到一個特定的設備)。 這裏的JavaScript來我的雲功能:

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 

admin.initializeApp(functions.config().firebase); 

exports.sendMessage = functions.https.onRequest((request, response) => { 

    var topicId = request.get('sendingTo'); 
    var color = request.get('color'); 
    var from = request.get('from') 

    console.log('tried to push notification'); 

    const payload = { 
     notification: { 

      title: from, 

      body: color, 

      sound: "default" 
     }, 

    }; 

    const options = { 
     priority: "high", 

     timeToLive: 60 * 60 * 24 
    }; 

    admin.messaging().sendToTopic(topicId, payload, options); 
}); 

最後,這裏的日誌: firebase console logs 這不能不說的函數被調用兩次。

我試圖尋找答案許多環節,如標準, https://firebase.google.com/docs/functions/http-events

和許多StackOverflow的帖子。我還沒有看到任何其他人有同樣的問題。

+1

這個來自文檔「總是用send(),redirect()或end()結束一個HTTP函數,否則你的函數可能會繼續運行並被系統強行終止。請參閱https://firebase.google.com/docs/functions/http-events –

+1

@mohamadrabee完全有效!非常感謝。我會重新發布你的答案作爲未來任何人的答案 –

回答

3

來自@mohamadrabee,「來自文檔的這個」總是用send(),redirect()或end()結束一個HTTP函數。否則,你的函數可能會繼續運行並被系統強行終止。 「看到firebase.google.com/docs/functions/http-events「

我說:

response.end(); 

後:

admin.messaging().sendToTopic(topicId, payload, options); 

編輯:插入此代碼後,我仍然得到問題大約7%的時間。我不得不將response.end();更改爲:

if (response.status(200)) { 
    response.status(200).end(); 
} else { 
    response.end(); 
} 

我從來沒有任何問題。

+1

Ps:這是正確的禮儀嗎?我是新來的SO –

+1

沒關係,歡迎來到SO,我很高興我的回答幫助你 –

相關問題