Express 服务器发送事件和Ajax与WebSocket和Ajax

Express 服务器发送事件和Ajax与WebSocket和Ajax,express,websocket,server-sent-events,ws,Express,Websocket,Server Sent Events,Ws,我正在创建一个applicationNuxtjs,在确定向APIexpressjs发送数据和检索实时更新的好方法时遇到了困难。似乎我可以用这两种协议(服务器发送的EventSSE和Axios或WebSocket)创建bi di连接 这两种技术都适用于大多数浏览器,因此我认为没有必要为那些当前浏览器不太好的用户添加额外的库,如socket.io 应用程序基于用户输入的表单数据/单击。然后通知/更新其他用户该信息。在这一点上,用户可以做出响应,然后链就开始了基本的聊天流程。一些信息会很快交换,而一些

我正在创建一个applicationNuxtjs,在确定向APIexpressjs发送数据和检索实时更新的好方法时遇到了困难。似乎我可以用这两种协议(服务器发送的EventSSE和Axios或WebSocket)创建bi di连接

这两种技术都适用于大多数浏览器,因此我认为没有必要为那些当前浏览器不太好的用户添加额外的库,如socket.io

应用程序基于用户输入的表单数据/单击。然后通知/更新其他用户该信息。在这一点上,用户可以做出响应,然后链就开始了基本的聊天流程。一些信息会很快交换,而一些信息可能不会或永远不会交换

根据我的经验,用户流更多地依赖于倾听变化,而不是实际改变数据——因此我考虑SSE。不幸的是,这两种协议都有其缺陷

WebSocket:

并非所有组件都需要WS来获取/发布信息,因此以额外的服务器费用升级基本http连接是没有意义的。因此,将需要WS以外的另一种方法AXIOS/SSR。示例:检查用户名是否存在 安全防火墙可能会阻止WS正常运行 expressws使套接字在API端变得简单 我相信你可以有6个以上的并发连接由一个用户可能是赞成和反对 服务器发送事件

似乎这项技术正在逐渐淡出WS 听这些事件似乎和听WS的事件一样简单 无需升级连接,但必须在ExpressJSAPI中使用节点spdy-由于多路复用,这对于WS也是一个很好的实现 再多一点后端代码来设置http2并发出SSEsUgly代码——因此将生成函数 仅限于HTTP限制6个并发连接,这是一个问题,因为用户可以轻松地最大化此outie。打开多个聊天窗口 TLDR

该应用程序将更加面向提要,偶尔发布可由Axios处理。但是,用户将收听多个提要,HTTP限制将是一个问题。我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手真的无关紧要,从我所读到的一切来看,情况并非如此,那么WS可能是一种更好的选择。不幸的是,关于这两者有太多相互矛盾的信息

想法?

我个人避免将WebSocket用作客户端和服务器之间的双向通信

我尝试使用套接字从服务器向用户或单个用户套接字广播数据,这样他们就可以获得实时更新,但对于从客户端到服务器的post请求,我倾向于使用axios或类似的工具,因为我不想将敏感数据(如访问密钥等)从客户端传递到服务器

我的数据流是这样的

用户使用axios、SSE或其他工具将数据发布到服务器 后端服务器执行它必须执行的操作,并通知套接字已发生事件 然后,套接字服务器通知他必须访问的用户 我使用套接字将数据从客户端发送到服务器的问题是身份验证问题。从技术上讲,您不能通过套接字传递客户端javascript不可用的任何内容,这意味着要验证操作,您必须通过websocket发送敏感信息。这是一个有多方面原因的问题-如果您的敏感数据可以使用客户端js访问,那么这里可以进行一系列攻击。还有人可以监听ws和客户端之间的通信。这就是为什么我使用API调用axios等并将敏感数据存储到仅http的Cookie中

所以,一旦服务器想要通知用户发生了什么事情,您就可以通过告诉websocket服务器将数据发送给用户来轻松地做到这一点

您还希望保持API服务器无状态,这意味着API中没有套接字。我只为websocket连接使用单独的服务器,我的API服务器和websocket服务器使用redis进行通信。Pub/sub是用于内部服务器通信和状态管理的一个非常简洁的功能

为了回答有关多个连接的问题,您可以在websocket服务器和客户端之间使用单个连接,并使用频道广播数据。因此,一个通道将用于通知提要,另一个通道可以用于故事提要等


我希望这对你有意义。这个堆栈对我来说非常好。

SSE、Web套接字和通过AJAX或Fetch API的正常HTTP请求都是用于不同作业的不同工具

上海证券交易所 单向,从服务器到客户端。 仅基于文本的数据。任何其他内容都必须序列化,即JSON。 简单的API,广泛兼容,自动重新连接,内置了跟踪可能错过的事件的功能。 网络 奥克特斯 双向的。 文本或二进制数据。 要求您对发送的数据实现自己的含义。 标准HTTP请求 客户端到服务器或服务器到客户端,但一次只能有一个方向。 文本或二进制数据。 需要额外的努力才能实时地将服务器响应流式传输到客户端。 从客户端到服务器的流式传输要求在请求时知道整个数据。例如,您不能执行事件流。 如何决定: 您是否将类似事件的数据从服务器流式传输到客户端?使用SSE。它是专门为此而设计的,是一种非常简单的方式。 您是否只向一个方向发送数据,而不需要自发地通知客户某些事情?使用普通的HTTP请求。 您是否需要通过长期建立的连接发送双向数据?使用Web套接字。 根据您的描述,听起来SSE或Web套接字都适合您的用例。我可能倾向于SSE,同时使用普通HTTP请求从客户端发送随机API调用

我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手真的无关紧要,从我所读到的一切来看,情况并非如此,那么WS可能是一种更好的选择


请记住,您可以简单地使用HTTP Keep alive配置您的服务器,这一点毫无意义。

您有哪些证据表明安全防火墙可能会阻止WS正常运行?我认为任何给WS带来问题的东西都可能给SSE的长期连接带来问题。WS是专门为基础架构兼容而设计的,并且已经存在很长时间了。SSE仍然没有被广泛使用。仅供参考,socket.io的存在是因为功能原因,而不是因为缺少浏览器支持。人们使用它的功能,特别是主动保持活动、连接断开检测和连接断开时自动重新连接。你可以在这里看到socket.io的功能:@jfriend00我读到多个消息来源,一些例如:sophos firewall在升级启动和后续事件触发后将断开连接。要找到确切的例子,我必须搜索Internet获取所有冲突信息crazy@jfriend00当然是socket.io有一些很酷的功能。我认为房间很整洁,但考虑到它几乎有100%的支持率。假设api支持您所需的功能,本机WS不是很简单吗?如果您不想自动重新连接、不想检测死连接、不想使用消息传递层等,本机WS也可以。。。在我看来,socket.io的存在是因为许多使用ws的严肃应用程序最终都需要这些东西。哦,一些更大规模的应用程序非常感谢socket.io使用redis提供的群集支持。谢谢你的回答。没有;wss通过Creditials解决了大多数安全/身份验证问题:true。此外,我正在使用API上的会话。这个答案是难以置信的错误信息。web套接字不存在HTTP不存在的固有安全问题。您应该使用HTTPS来有效地运行Web套接字。此外,用于处理API调用的身份验证也可以处理websocket调用。至于无状态与否,您选择的通信协议并不决定您如何使用它。@Brad我在httponly Cookie中设置了我的身份验证令牌,首先是为了防止XSS攻击。Httponly cookies不是http独有的,当然我会在生产中使用https。套接字无法在客户端到服务器的通信中读取httponly Cookie。如果您在websocket内将身份验证令牌从客户端传递到服务器,这是一种负担。在第二部分中,我同意您的观点,使用wss并不会使API无状态,但根据我的经验,在处理套接字时通常需要某种状态管理。但我想这只是与你构建的应用程序有关。谢谢你提供的详细信息。你能简单地解释一下HTTP保持活动将如何影响我的决定吗?我只是纠正了一个假设,即你需要为每个后续HTTP请求建立TCP连接。HTTP保持活动状态允许TCP连接保持打开状态,并在将来的请求中重新使用。如果您希望收到更多请求,那么这将更加高效。您可以配置您的服务器,使其保持长时间或短时间的开放。加载网页的人通常需要5秒钟。对于您的用例,您可以选择5分钟。Thx!!-当我遍历应用程序时,我可以在不同的端点上使用单个升级连接吗?如果可能的话,我想我需要一个库,使处理切换更容易?或者我只是简单地使用get请求的组合来加载页面内容,然后建立一个新的连接这就是我的知识非常缺乏的地方-任何建议都是绝对必要的,你不需要做任何事情。。。底层浏览器已经完成了所有这一切。只需更改服务器的配置即可 nd HTTP保持活动状态,以使连接保持比默认连接打开的时间更长。