Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 离线时添加/删除对象在线时触发云功能。如何避免云函数在空路径上添加数据?_Javascript_Firebase Realtime Database_Google Cloud Platform_Google Cloud Functions - Fatal编程技术网

Javascript 离线时添加/删除对象在线时触发云功能。如何避免云函数在空路径上添加数据?

Javascript 离线时添加/删除对象在线时触发云功能。如何避免云函数在空路径上添加数据?,javascript,firebase-realtime-database,google-cloud-platform,google-cloud-functions,Javascript,Firebase Realtime Database,Google Cloud Platform,Google Cloud Functions,脱机时,如果我将对象添加到云函数正在侦听的路径,然后在脱机时将其删除,则在联机时,Firebase服务器将接收对象创建,然后在其删除后立即接收。 问题在于,它将在创建时触发一个云函数。此云函数将捕获另一路径上的一些数据,并将该数据添加到创建的对象中。但由于对象是在脱机时删除的,因此最终会被删除。但是,云函数将在添加到其他地方获取的数据时(部分)重新创建它 因为我不想跟踪我创建/删除的每个对象,所以我考虑在保存数据之前检查对象是否仍然存在。问题是,当我这样做时,对象仍然存在,但当我将数据保存到对象

脱机时,如果我将对象添加到云函数正在侦听的路径,然后在脱机时将其删除,则在联机时,Firebase服务器将接收对象创建,然后在其删除后立即接收。 问题在于,它将在创建时触发一个云函数。此云函数将捕获另一路径上的一些数据,并将该数据添加到创建的对象中。但由于对象是在脱机时删除的,因此最终会被删除。但是,云函数将在添加到其他地方获取的数据时(部分)重新创建它

因为我不想跟踪我创建/删除的每个对象,所以我考虑在保存数据之前检查对象是否仍然存在。问题是,当我这样做时,对象仍然存在,但当我将数据保存到对象中时,它已经不存在了


我有什么选择?我曾考虑过添加0.5s睡眠,但我认为这不是最好的做法。

首先,在客户端应用程序上没有什么可以帮助这种情况。为了弥补这一点,您所做的一切都将在云函数中进行

其次,您必须假设事件可能会无序交付。在创建之前,可以由云函数处理删除。如果您的代码不能处理这种情况,则可能会出现不一致

您说过“我不想跟踪我创建/删除的每个对象”,但事实是,如果您希望一致地处理可能发生的无序事件,这是最好的选择。如果您使用云功能,就没有简单的方法可以摆脱这种情况。最重要的是,您的函数应该是幂等的,因此它们可以处理可以多次传递的事件

一种替代方法是避免对文档进行更改,而是将“命令”对象推送到云函数,这些云函数告诉它应该更改的内容。这可能有点帮助,但您也应该假设这些命令可能会出现错误


这是无服务器后端的全部缺点。好处是您不必设置、管理和取消分配服务器实例。但是,您的代码必须能够适应这些问题。

首先,在客户端应用程序上,您无法做很多事情来帮助解决这种情况。为了弥补这一点,您所做的一切都将在云函数中进行

其次,您必须假设事件可能会无序交付。在创建之前,可以由云函数处理删除。如果您的代码不能处理这种情况,则可能会出现不一致

您说过“我不想跟踪我创建/删除的每个对象”,但事实是,如果您希望一致地处理可能发生的无序事件,这是最好的选择。如果您使用云功能,就没有简单的方法可以摆脱这种情况。最重要的是,您的函数应该是幂等的,因此它们可以处理可以多次传递的事件

一种替代方法是避免对文档进行更改,而是将“命令”对象推送到云函数,这些云函数告诉它应该更改的内容。这可能有点帮助,但您也应该假设这些命令可能会出现错误


这是无服务器后端的全部缺点。好处是您不必设置、管理和取消分配服务器实例。但是您的代码必须能够适应这些问题。

谢谢Doug的回答。因为您提到了
文档
,所以首先我想澄清一下,我使用的是RTDB,而不是Firestore。关于事件的顺序,我认为在使用移动SDK时,所有事件都会按照创建顺序发送到Firebase服务器。如果不是这样的话,如果它试图首先在服务器上删除Object1,它怎么知道它是创建的呢?我的函数在某种程度上是幂等的,因为它只在特定字段上触发
onCreate
,除非删除整个对象,否则不会删除该字段。所以每个对象只调用一次。没有任何排序保证。我提到过。云Firestore和实时数据库的行为相同。我想你可能误解了幂等元的意思。谢谢道格的回答。因为您提到了
文档
,所以首先我想澄清一下,我使用的是RTDB,而不是Firestore。关于事件的顺序,我认为在使用移动SDK时,所有事件都会按照创建顺序发送到Firebase服务器。如果不是这样的话,如果它试图首先在服务器上删除Object1,它怎么知道它是创建的呢?我的函数在某种程度上是幂等的,因为它只在特定字段上触发
onCreate
,除非删除整个对象,否则不会删除该字段。所以每个对象只调用一次。没有任何排序保证。我提到过。云Firestore和实时数据库的行为相同。我想你可能误解了幂等元的意思。