node.js - Socket.io app ...我应该使用emit还是使用常规http请求并用express处理它?

标签 node.js express socket.io

我正在创建 Socket.io 应用程序,有时需要从数据库检索信息。我很难弄清楚这些请求是否应该使用 socket.io 发送和处理,或者是否应该像常规 http 请求一样发送并使用 Express 在服务器中处理。

我可以使用socket.emit("my-event),然后使用socket.on("my-event", () =>{...向数据库发出请求...})在服务器中处理它,然后从数据库获取结果后,我可以发出另一个事件,使用socket.emit("result-from-the-DB", dataFromDB)将结果发送到客户端。

我知道您可能会想“您不需要 Socket.io”,但应用程序最重要的部分将需要它,因为它的功能非常类似于聊天应用程序。例如,假设用户在此应用程序中单击“查看我的个人资料”。向服务器发送的请求应该使用 socket.io (使用上述步骤)还是仅使用常规 http 请求?

最佳答案

Socket.io app … should I use emit or use a regular http request and handle it with express?

没有完全正确的答案。老实说,无论哪种方式你都可以让它工作得很好。以下是各自的一些优点:

通过 http 请求发送的优点:

  1. http 是一种请求/响应协议(protocol)。如果您发送请求并期望对特定请求做出响应,那么 http 的设计会更好一些。 socket.io 并不真正对特定的“请求”有“响应”。您可以通过发回消息或使用确认回调来模仿这一点。

  2. 如果您设想此 API/功能有任何其他公共(public)用途或在 socket.io 应用程序之外使用,那么 http 通常是合适的公共(public) API。

  3. 如果您需要发送大量数据(例如上传文件),那么已经为 http 构建了更成熟的解决方案。

  4. socket.io 错误处理更多是在全局级别,而不是针对特定消息。例如,无法专门监听发送特定消息时是否出现错误。如果socket.io库遇到套接字问题,它将关闭套接字并尝试重新连接。有时这是一个功能,有时这是了解您的数据是否真正到达那里的障碍。无论您的请求是否已送达,http 请求都会为您提供清晰、直接的反馈。

  5. 如果您在处理此消息时所做的操作与您使用 socket.io 所做的其他操作无关,那么使用 http 处理它可能会更干净(从模块设计的角度来看),这样您就不必在与其他内容无关的 socket.io 模块中混合代码。

通过 socket.io 消息发送的优点:

  1. 一旦您已经有一个活跃的 socket.io 连接,使用 socket.io 向您的服务器发送一条小消息的开销就会低得多。因此,特别是如果您以这种方式发送大量小消息,socket.io 的效率可能会显着提高。

  2. 如果 socket.io 功能(例如命名空间和房间)在处理此请求时有任何好处,那么使用 socket.io 在服务器上处理它可能会更容易。

  3. 如果您发送的消息与您在服务器上使用 socket.io 执行的其他操作直接相关,那么在您的 socket.io 模块中处理该请求可能会更清晰(从模块设计的角度来看)。

关于node.js - Socket.io app ...我应该使用emit还是使用常规http请求并用express处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60251519/

相关文章:

node.js - 收到错误 PayloadTooLargeError : request entity too large in case of Using express. Router() 后调用

javascript - 为什么要执行前一个屏幕组件中的 socket.on() ?

javascript - SailsJS : POST requests are not resolved properly when invoking req. param() 和 req.file()

javascript - 如何将 id-aes256-GCM 与 Node.JS 加密一起使用? "TypeError: DecipherFinal fail"

javascript - 如何跳过数组.map 的元素?

node.js - 通过 node.js 的 npm 安装 gulp 会破坏窗口

javascript - 如何在 Express 应用程序中获取下一条路线的路径

node.js - 如何呈现子文件夹中的 HTML 文件?

javascript - 将变量调用到不同的路径在 Nodejs 和 Express 中不起作用

javascript - 将 socket.on 包装为 promise