我正在尝试将Firebase云功能集成到Android应用中。我是Cloud Functions和Node.js的新手。
所以,我有以下简单的node.js代码来保存Firestore数据库中的数据:
'use strict';
const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
const Firestore = require('@google-cloud/firestore');
exports.saveData = functions.https.onRequest((request, response) => {
var firestoreDB = new Firestore({
projectId: 'my_project_id',
keyFilename: 'my_key_file_name'
});
const line1 = request.body.line1;
const line2 = request.body.line2;
var data = {
name: line1,
number: line2
};
return firestoreDB.collection('myData').doc('firstDoc')
.add( data )
.then(ref => {
console.log('Data saved.');
response.end();
});
});
此代码工作正常,但执行两次。它将数据写入数据库两次,它在Firebase控制台日志屏幕中将每个日志记录两次。
我尝试了另一个功能,使用FCM从Android设备向Android设备发送消息,它也会发送消息两次。
我检查了Android端,以确保它被触发一次。我想知道是否有任何我错过的工作。任何帮助或建议表示赞赏。
答案 0 :(得分:1)
您没有从API发送响应,因此浏览器没有得到任何响应,它会重试API,直到60秒的超时。
response.status(200).send('OK');
输入以上行,如下所示 -
exports.saveData = functions.https.onRequest((request, response) => {
var firestoreDB = new Firestore({
projectId: 'my_project_id',
keyFilename: 'my_key_file_name'
});
const line1 = request.body.line1;
const line2 = request.body.line2;
var data = {
name: line1,
number: line2
};
return firestoreDB.collection('myData').doc('firstDoc')
.add( data )
.then(ref => {
console.log('Data saved.');
response.status(200).send('OK');
});
});
答案 1 :(得分:1)
因此,真正的问题出现在Android(Java)方面Volley
。默认情况下,如果Volley在2.5秒内没有收到回音,则会第二次尝试到达服务器。因为我的操作繁重,有时互联网速度有所下降,所以总是需要2.5秒才能回复。
如果有人遇到类似问题,请仔细检查Volley
,并确保在Volley
请求
stringRequest.setRetryPolicy(
new DefaultRetryPolicy(
15000, // timeout timimg of 15 sec
0, // number of retries. By default the number is 1
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
// Add the request to the RequestQueue.
MySingleton.getInstance().addToRequestQueue(stringRequest);