我正在编写我已添加Firebase-admin SDK的Node.js / ExpressJS服务器。
服务器现在正处于重大发展阶段,因此其功能的很大一部分都受到了某种模拟的嘲弄。这种情况是服务器将收到来自客户端的请求,说客户希望窗帘上升或下降。
流程是:
然后服务器向盲人发送一个请求,告知它应该指定方向。在此之后,服务器会在Firebase的实时数据库中更新盲人的移动状态。当盲人一直向上或向下移动时,它会向服务器发送一个请求,说该移动已经完成。然后,服务器使用新状态(如CLOSED
或OPENED
)更新Firebase的实时数据库。
正如我之前提到的,此功能也被嘲笑,因此盲人的动作实际上是由setTimeout
功能处理的,该功能可以模拟'每个盲人的动作持续10秒。运动之后'完成后,setTimeout
函数会blindState
更改为CLOSED
或OPENED
状态,这应该模拟将发送到服务器的盲人响应在将来。
我想让Firebase的实时数据库更新为每个盲人的blindState
值。因此,盲人已经完成了移动'我还想将更新的数据发送到firebase。这似乎有问题。 blindStateRef
的值为"test/devicesStates/blindStateRef"
。此路径中对象的名称将是百叶窗的ID。每个盲人都会有一个名为state
的字段,其中包含盲人是OPENED
,CLOSED
还是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);
答案 0 :(得分:0)
好的,我找到了解决方案。
我没有从_id
对象中提取blind
字段,而是重构了blindMovementFunction
以获取3个参数,并在那里添加了blindId
。
blindId
正好是blind._id
,但是在调用函数时,该值会直接传递给函数。 blind._id
在函数内部具有正确的值。
不知道为什么会开始工作,但我会在这里留下这些信息,以供将来偶然发现遇到类似问题的人参考