Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 如何在Node.js服务器上的多个客户端之间同步数据_Javascript_Json_Node.js_Data Synchronization - Fatal编程技术网

Javascript 如何在Node.js服务器上的多个客户端之间同步数据

Javascript 如何在Node.js服务器上的多个客户端之间同步数据,javascript,json,node.js,data-synchronization,Javascript,Json,Node.js,Data Synchronization,下图是我正在创建的web应用程序的基本表示 该应用程序的基本操作如下: 客户端从node.js服务器发送数据请求 服务器接收请求 服务器从数据库获取数据 服务器将数据作为JSON字符串发送回客户端 客户端接收数据,将其存储为JSON对象并将其绑定到表 这一切都很好。下面的情况最能说明我的问题 客户端1到4都完成了上述步骤(即,所有客户端都有一个绑定到JSON对象的数据表) 客户端1现在向服务器发送更新请求 服务器接收请求 服务器更新数据库 服务器向客户端1发送指示操作成功的响应,并更新绑定到表

下图是我正在创建的web应用程序的基本表示

该应用程序的基本操作如下:

  • 客户端从node.js服务器发送数据请求
  • 服务器接收请求
  • 服务器从数据库获取数据
  • 服务器将数据作为JSON字符串发送回客户端
  • 客户端接收数据,将其存储为JSON对象并将其绑定到表
  • 这一切都很好。下面的情况最能说明我的问题

  • 客户端1到4都完成了上述步骤(即,所有客户端都有一个绑定到JSON对象的数据表)
  • 客户端1现在向服务器发送更新请求
  • 服务器接收请求
  • 服务器更新数据库
  • 服务器向客户端1发送指示操作成功的响应,并更新绑定到表的JSON对象
  • 问题客户端2到4上显示的JSON数据现在不再与数据库同步

  • 因此,我的问题是如何使所有4个(或更多)客户端上的JSON数据与Node.js服务器上的数据库实时同步?

    简而言之,您需要的是在发生更改时通知客户端。尝试寻找WebSocket,网上有很多很好的教程。基本上,websocket是服务器和客户机之间的通信通道。您应该做的是向客户机发送关于更改内容的通知,然后每个客户机应该确定是否必须更新某些内容(并请求信息)

    看看这个库:


    我认为它是最好的(如果它不是最好的)之一,您甚至可以找到示例和演示。

    如果您愿意接受完整的堆栈框架,那么您将尽一切努力使所有客户端视图与更改保持同步


    Meteor是一个需要承担的巨大依赖性——它在你的堆栈的每一层都对你的技术选择有意见——因此它不会适合所有人,但如果你想要快速的结果,它很难被击败。

    我认为在2021年实现这一点的最好方法是使用服务器发送的事件。您的后端可以在每次接收数据时向所有其他客户端发送服务器发送事件。SSE基本上是下游单向事件,浏览器可以像侦听websocket一样侦听它们

    客户端只会在网络延迟方面不同步,这是不可避免的


    在我看来,SSE的唯一问题是浏览器兼容性较低,因此它将破坏IE 11的支持。

    已经有很多关于所有类型同步策略的书籍和博士论文。使用什么取决于一系列因素(用例、数据更改的数量、客户端脱机的频率、冲突策略、数据集的大小等)。客户端1、2、3、4是否始终联机?或者他们上网后必须更新同步?此外,您真的必须将所有数据存储在本地吗。云服务的一个优点是维护一个单一的中央存储库,并且只让客户端根据需要查询。@jfriend00您可以推荐任何特定于Node.js服务器的书籍吗?客户总是在线的。在此阶段,数据将本地存储在我们的内部服务器上,该服务器也将用作数据的单一中央存储库。简单地说,您需要的是在发生更改时通知客户端。尝试寻找WebSocket,网上有很多很好的教程。基本上,websocket是服务器和客户端之间的通信通道。您应该做的是向客户端发送一个关于更改内容的通知,然后每个客户端都应该确定是否必须更新某些内容(并请求信息)。您的问题实际上根本不特定于node.js服务器。这是特定于您的数据存储以及我在之前的评论中列出的所有其他问题的。如果您的客户端始终处于联机状态,则可以创建从每个客户端到node.js服务器的webSocket连接,然后每次任何客户端对数据存储进行更改时,都会将该增量发送给所有其他客户端。但是,如果任何一个客户离线一段时间,那么当它恢复在线时,你必须发明一种追赶策略。如果你在谷歌上搜索“数据同步策略”,有很多内容值得阅读。我编辑了我的答案,以便为WebSocket提供最好的LIB之一。您将找到客户端、服务器和演示的示例。我强烈建议您不要在项目中从头开始,而是构建一个可运行的示例,以了解什么是WebSocket,它们是如何工作的,以及您到底需要什么。完成后,继续将其应用到您的项目中。听起来不错,但我读到该堆栈附带预安装的数据库。它能与我们预先配置的MySQL数据库交换吗?Meteor实际的数据存储是同步的还是保持客户端视图最新?OP要求数据存储同步。它使用Comet上的发布/订阅机制使所有连接的客户端视图与任何客户端所做的更改保持同步。@josh Meteor以MongoDB为基础,但可能有第三方支持SQL。如果你想试试Meteor,我建议你还是选择Mongo。@saille非常感谢!非常感谢你们的帮助。这家伙要求同步,你们谈论沟通。GL HF实现异步多线程读写对象bro。