在节点js中的Firebase Admin SDK中更新或设置会导致无限回调

时间:2018-05-10 12:40:20

标签: node.js firebase firebase-realtime-database firebase-admin

我从Firebase数据库的节点获取数据,然后在进行一些计算后我正在更新它。

我在节点js中使用Firebase SDK来执行此任务。

以下是代码:

app.get("/setBookedSpots", function (request, response) {
    console.log("booked spots called");

    var verifierEmail = request.query.verifierEmail;
    var toBeBookedSpot = request.query.bookSpot;

    console.log(toBeBookedSpot);

    admin.auth().getUserByEmail(verifierEmail)
        .then(function (userRecord) {
            console.log("Successfully fetched user data:", userRecord.toJSON());

            var verifierId = userRecord.uid;

            var refToUserInformation = db.ref("user/" + verifierId);

            refToUserInformation.child("Society_Name").on("value", function (snapshot) {
                console.log(snapshot.val());
                var SocietyName = snapshot.val();

                refToSocietyBookingStatus = db.ref("Societies/" + SocietyName + "/Society_Parking_Details/Society_Parking_Status");

                refToSocietyBookingStatus.child("Booked_Spots").on("value", function (snapshot) {

                    var Booked_Spots = snapshot.val();

                    console.log(Booked_Spots);
                    console.log("to be booked spot", toBeBookedSpot);

                    Booked_Spots = Booked_Spots.toString() + "," + toBeBookedSpot;

                    console.log("after booked spot", Booked_Spots);
                    refToSocietyBookingStatus.update({
                        "Booked_Spots": Booked_Spots
                    })

                    response.send({ "msg": "success" });
                })
            })
        });
});

我正在获取预订的位置并根据请求参数更新它们。

当我点击它时,它会进行无限回调。我的意思是它继续递归附加,因为没有循环使它崩溃。

我尝试使用不同的变量作为数据库引用,以便它可能不会再次调用父事件,但仍然存在同样的问题。

这是服务电话网址:

http://localhost:8080/setBookedSpots?verifierEmail=kemarikun@gmail.com&bookSpot=A7

2 个答案:

答案 0 :(得分:1)

在尝试了很多之后,我开始知道on("value")事件正在执行,因为我正在更新同一个节点,我刚刚从中恢复了值,因此进行了递归并继续调用,因为它继续更新

以下是解决方法:将on("value")替换为once("value")

让它只执行一次。

答案 1 :(得分:0)

您可以使用response.send({ "msg": "success" });代替response.send(JSON.stringify({ msg: 'success'}));更改此ansible-pull -U <repository> [options] [<playbook.yml>]