我有一個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的帖子。我還沒有看到任何其他人有同樣的問題。
這個來自文檔「總是用send(),redirect()或end()結束一個HTTP函數,否則你的函數可能會繼續運行並被系統強行終止。請參閱https://firebase.google.com/docs/functions/http-events –
@mohamadrabee完全有效!非常感謝。我會重新發布你的答案作爲未來任何人的答案 –