1

我已通读 Firebase Cloud Functions参考指南示例代码,试图确定我的函数被触发两次的原因,但尚未找到成功的解决方案。我还试用了Firebase-Queue作为解决方法,但它的最新更新表明 Cloud Functions 是可行的方法。

简而言之,我正在使用 检索来自外部 API 的通知,将request-promise这些通知与我的数据库中已有的通知进行检查,并在识别出新通知时将其发布到所述数据库。然后参考新通知更新相应的地点。代码如下:

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request');
const rp = require('request-promise');

admin.initializeApp(functions.config().firebase);

const db = admin.database();
const venues = db.ref("/venues/");

exports.getNotices = functions.https.onRequest((req, res) => {
    var options = {
        uri: 'https://xxxxx.xxxxx',
        qs: {
            format: 'json',
            type: 'venue',
            ...
        },
        json: true
    };
    rp(options).then(data => {
            processNotices(data);
            console.log(`venues received: ${data.length}`);
            res.status(200).send('OK');
        })
        .catch(error => {
            console.log(`Caught Error: ${error}`);
            res.status(`${error.statusCode}`).send(`Error: ${error.statusCode}`);
    });
});

function processNotices(data) {
    venues.once("value").then(snapshot => {
        snapshot.forEach(childSnapshot => {
            var existingKey = childSnapshot.val().key;
            for (var i = 0; i < data.length; i++) {
                var notice = data[i];
                var noticeKey = notice.key;
                if (noticeKey !== existingKey) {
                    console.log(`New notice identified: ${noticeKey}`)
                    postNotice(notice);
                }
            }
            return true;
        });
    });
}

function postNotice(notice) {
    var ref = venues.push();
    var key = ref.key;
    var loc = notice.location;
    return ref.set(notice).then(() => {
        console.log('notice posted...');
        updateVenue(key, loc);
    });
}

function updateVenue(key, location) {
    var updates = {};
    updates[key] = "true";
    var venueNoticesRef = db.ref("/venues/" + location + "/notices/");
    return venueNoticesRef.update(updates).then(() => {
        console.log(`${location} successfully updated with ${key}`);
    });
}

任何有关如何纠正双重触发的建议将不胜感激。提前致谢!

4

1 回答 1

0

问题已解决 - Firebase 控制台日志(重复条目)中的一些错误信息,加上for错误顺序的嵌套循环是造成明显双重触发的原因。

于 2017-07-05T05:46:53.023 回答