我在使用Capybara的系统规格中使用ActionCable时遇到问题。 ActionCable在我的开发服务器上可以正常运行,但是在按照系统规格进行测试时,它无法连接到Websockets。/log/test.log
的输出显示:
Started GET "/cable" for 127.0.0.1 at 2017-11-15 18:17:04 +0900
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-15 18:17:04 +0900
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
WebSocket error occurred: undefined method `write_nonblock' for nil:NilClass
WebSocket error occurred: undefined method `write_nonblock' for nil:NilClass
WebSocket error occurred: undefined method `write_nonblock' for nil:NilClass
我正在使用:
红宝石2.4.1
导轨5.1.4
RSpec 3.7.0
水豚2.13.0
彪马3.10.0
selenium-webdriver 3.6.0
我努力了:
Capybara.server = :puma
这没有什么区别(可能是因为系统规格已经在使用Puma)。
我尝试调试问题:
仔细观察错误,在
write_nonblock
上调用方法nil
,这发生在第45行:https://github.com/rails/rails/blob/385825fb705446a1f11e82b65ca97a50d7e67898/actioncable/lib/action_cable/connection/stream.rb#L45
似乎
@rack_hijack_io
设置为nil
,这很可能在以下hijack_rack_socket
方法中发生:https://github.com/rails/rails/blob/385825fb705446a1f11e82b65ca97a50d7e67898/actioncable/lib/action_cable/connection/stream.rb#L102
@socket_object.env["rack.hijack_io"]
返回nil
,所以我们没有"rack.hijack_io"
键。因此该错误似乎与Rack Hijacking API有关。 最佳答案
我不知道有关您测试的详细信息,但就我而言,问题出在config.log_level = :debug
中的config/environments/[env]
中。
因为ActionCable会产生许多有关广播的调试信息。例如,如果您有100个已连接的客户端,则每次广播的日志文件都会被100条消息污染。
PS:我在使用Stackdriver Logging的NGINX + Passenger(6.0.4)+ GKE上捕获了此错误。