Firebase在setTimeout回调中执行函数时遇到问题吗?

时间:2018-01-06 18:25:18

标签: javascript node.js firebase express firebase-realtime-database

我正在编写我已添加Firebase-admin SDK的Node.js / ExpressJS服务器。

服务器现在正处于重大发展阶段,因此其功能的很大一部分都受到了某种模拟的嘲弄。这种情况是服务器将收到来自客户端的请求,说客户希望窗帘上升或下降。

流程是:

然后服务器向盲人发送一个请求,告知它应该指定方向。在此之后,服务器会在Firebase的实时数据库中更新盲人的移动状态。当盲人一直向上或向下移动时,它会向服务器发送一个请求,说该移动已经完成。然后,服务器使用新状态(如CLOSEDOPENED)更新Firebase的实时数据库。

正如我之前提到的,此功能也被嘲笑,因此盲人的动作实际上是由setTimeout功能处理的,该功能可以模拟'每个盲人的动作持续10秒。运动之后'完成后,setTimeout函数会blindState更改为CLOSEDOPENED状态,这应该模拟将发送到服务器的盲人响应在将来。

我想让Firebase的实时数据库更新为每个盲人的blindState值。因此,盲人已经完成了移动'我还想将更新的数据发送到firebase。这似乎有问题。 blindStateRef的值为"test/devicesStates/blindStateRef"。此路径中对象的名称将是百叶窗的ID。每个盲人都会有一个名为state的字段,其中包含盲人是OPENEDCLOSED还是MOVING的信息。

当我尝试更新数据库时,出现错误Error: Reference.child failed: First argument was an invalid path = "5a5106f0144ad2bf792a9eda". Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"

是否因为在setTimeout函数内部调用它而引起的?

这是电话:

const blindMovementFunction = (blind, direction) => setTimeout((blind, direction) => {
    if (direction === "UP") {
        blindState = "OPENED";

        blindStateRef.child(blind._id).set({
            state: blindState
        });

        blind.state = blindState;
        blind.save();
    } else if (direction === "DOWN") {
        blindState = "CLOSED";

        blindStateRef.child(blind._id).set({
            state: blindState
        });

        blind.state = blindState;
        blind.save();
    }
}, 10000, blind, direction);

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。

我没有从_id对象中提取blind字段,而是重构了blindMovementFunction以获取3个参数,并在那里添加了blindId

blindId正好是blind._id,但是在调用函数时,该值会直接传递给函数。 blind._id在函数内部具有正确的值。

不知道为什么会开始工作,但我会在这里留下这些信息,以供将来偶然发现遇到类似问题的人参考