私はAndroidアプリケーションでHTTPトリガークラウド機能にPOSTリクエストを送信する機能を持っています。メッセージを送信するためにボタンを1回クリックすると、FirebaseはFirebaseコンソールにイベントを2回登録します。私のアプリケーションは、最初のクリック後にメッセージを送信するボタンが消えるようにビルドされているので、私は誤ってボタンをダブルクリックしているわけではなく、デバッガをステップ実行するとPOSTリクエストを送信する機能が呼び出されます一度。みんな助けてくれますか?私はFirebaseについてよく知らないし、良い文書やこのような質問を見つけることができない。このCloud機能がAndroid HTTPリクエストトリガーで複数回呼び出されたのはなぜですか?
ここに私の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のだ: firebase console logs 関数が二回呼び出されたことを言う:
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);
});
は最後に、ここにログがあります。
私は、 https://firebase.google.com/docs/functions/http-events
と多くのStackOverflowのポストを、標準としての答えのために多くのリンクを試してみました。私は同じ問題を抱えている誰も見たことがありません。
これは、「常にsend()、redirect()、またはend()でHTTP機能を終了してください。そうしないと、機能が実行され続け、システムによって強制終了される可能性があります。 https://firebase.google.com/docs/functions/http-events –
@mohamadrabeeを参照してください。どうもありがとうございます。私はあなたの答えを将来の誰のための答えとして再投稿します –