如何在本地环境中为其他 Rails 应用程序禁用 Rails ActionCable WebSocket 通道

How to disable Rails ActionCable WebSocket channel for other Rails app in local env

提问人:abron 提问时间:9/21/2023 更新时间:9/22/2023 访问量:69

问:

我正在开发两个不同的 Rails 应用程序。在应用 1 上,我创建了一个名为“ProductsChannel”的频道来广播更改。后来,我关闭了应用程序 1 的服务器,并启动了应用程序 2 的服务器,我已经几天没有工作了。但现在它正在尝试从应用程序 1 连接到我的“ProductsChannel”。它找不到它,所以它反复告诉我它找不到频道。日志如下。

如何阻止应用程序 2 尝试使用 WebSockets?我从未向应用程序 2 添加任何频道,所以不确定它是如何被拉入其中的。

Started GET "/cable" for ::1 at 2023-09-21 14:57:20 +0200
  ActiveRecord::SchemaMigration Pluck (0.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Started GET "/cable" [WebSocket] for ::1 at 2023-09-21 14:57:20 +0200
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Started GET "/cable" for ::1 at 2023-09-21 14:57:20 +0200
Started GET "/cable" [WebSocket] for ::1 at 2023-09-21 14:57:20 +0200
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Started GET "/cable" for ::1 at 2023-09-21 14:57:20 +0200
Started GET "/cable" [WebSocket] for ::1 at 2023-09-21 14:57:20 +0200
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Subscription class not found: "ProductsChannel"
Subscription class not found: "ProductsChannel"
Subscription class not found: "ProductsChannel"
...

这两个应用程序都在 Rails 7 上。

我已确保应用程序 1 的服务器未运行。我尝试关闭应用程序 2 并重新启动。

我怀疑重新启动笔记本电脑可能会解决它,但我不应该在每次切换应用程序时重新启动整个机器。

Ruby-on-Rails WebSocket 操作电缆 Ruby-on-Rails-7

评论

0赞 mechnicov 9/21/2023
您可能已经使用 app1 打开了浏览器选项卡?顺便说一句,为什么不在不同的端口上运行应用程序?
0赞 abron 9/21/2023
是的,事实证明我确实有一个打开的浏览器选项卡,其中包含应用程序 1。关闭该问题。谢谢。在不同的端口上运行是个好主意。我没有打扰,因为一个应用程序只是跟着教程一起操作,而另一个是我实际正在构建的东西。

答:

0赞 abron 9/21/2023 #1

感谢评论中的mechnikov指出了我的菜鸟错误。我打开了一个浏览器选项卡,其中包含应用程序 1。关闭此选项卡解决了该问题。

评论

0赞 Community 9/25/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
2赞 mechnicov 9/22/2023 #2

由于已启用应用程序的日志包含对 websockets 端点的请求,甚至包含无法找到已禁用应用程序通道的记录,这意味着某些客户端仍然连接到您的服务器并发送这些请求

在这方面,首先想到的是一个打开的浏览器选项卡,该选项卡订阅了与当前后端相同的端口上的 websocket 通道

若要排除此行为,可以关闭此类选项卡或对不同的应用程序使用不同的端口