2

私は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のポストを、標準としての答えのために多くのリンクを試してみました。私は同じ問題を抱えている誰も見たことがありません。

+1

これは、「常にsend()、redirect()、またはend()でHTTP機能を終了してください。そうしないと、機能が実行され続け、システムによって強制終了される可能性があります。 https://firebase.google.com/docs/functions/http-events –

+1

@mohamadrabeeを参照してください。どうもありがとうございます。私はあなたの答えを将来の誰のための答えとして再投稿します –

答えて

3

@hohamadrabeeより、「これはドキュメントからのものです」常にsend()、redirect()、またはend()でHTTP機能を終了してください。そうしないと、機能が実行され、システムによって強制終了される可能性があります。 '参照firebase.google.com/docs/functions/http-events「

は、私が追加:

response.end(); 

後:

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

EDIT:このコードを挿入した後、私はまだ問題を得ます時間のおよそ7%。私は以来、何の問題もありませんでした

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

:私はにresponse.end();を変更しなければなりませんでした。

+1

Ps:これは正しい礼儀ですか?私はSO –

+1

に新しいです。それは大丈夫です、ようこそ、私は私の答えがあなたを助けてくれてうれしいです –

関連する問題