Firebase Cloud功能触发两次

时间:2018-01-05 07:56:34

标签: android node.js google-cloud-functions

我正在尝试将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端,以确保它被触发一次。我想知道是否有任何我错过的工作。任何帮助或建议表示赞赏。

2 个答案:

答案 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);