gpt4 book ai didi

javascript - 为什么使用 Android HTTP 请求触发器多次调用此 Cloud Function?

转载 作者:搜寻专家 更新时间:2023-11-01 08:25:27 24 4
gpt4 key购买 nike

我在 Android 应用程序中有一个函数,它向 HTTP 触发的 Cloud Functions 发送 POST 请求。每当我单击一次按钮发送消息时,Firebase 都会在 Firebase 控制台上注册该事件两次。我的应用程序的构建方式是第一次单击后发送消息的按钮消失,所以我不是不小心双击了按钮,当我单步执行调试器时,发送 POST 请求的函数只被调用一次。你们能帮帮我吗?我对 Firebase 了解不多,找不到好的文档或其他类似的问题。

这是向我的 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 帖子。我还没有看到其他人遇到同样的问题。

最佳答案

来自@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();
}

从那以后我没有遇到任何问题。

关于javascript - 为什么使用 Android HTTP 请求触发器多次调用此 Cloud Function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com