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

Update or Set in Firebase Admin SDK in node js causes infinite callbacks

我正在从 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" });
                })
            })
        });
});

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

当我击中它时,它会无限回调。我的意思是它继续递归追加,因为没有循环导致它崩溃。

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

这是服务调用 url:

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

您可以使用而不是 response.send({ "msg": "success" }); 来更改此 response.send(JSON.stringify({ msg: 'success'}));

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

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

让它只执行一次。