ruby-on-rails - 无法通过远程源连接到 Action Cable

标签 ruby-on-rails actioncable

我已经在我们的 Rails 应用程序上设置了一个 websocket,并且已经能够从同一台服务器连接和接收数据。

我现在所做的方法是创建一个这样的套接字:

class UsersChannel < ApplicationCable::Channel
  def subscribed
    stream_from "users_1"
  end

  def unsubscribed

  end
end

然后我使用javascript打开与
new WebSocket('wss://domain.com/cable/users_1');
然后我以这种格式从页面广播和发送 JSON:
ActionCable.server.broadcast "users_1", {
      store: {
        name: store.name,
        address: {
          full_address: location.address,
          latitude: location.latitude,
          longitude: location.longitude
        }
    }

当它被触发时,我可以在我的控制台中看到它出现。我在 JS 中添加了这个 channel :
App.cable.subscriptions.create "UsersChannel",
  received: (data) ->
    console.log data

现在我们正在使用 React Native 构建一个应用程序,当我们将此代码添加到我们的应用程序时:
var ws = new WebSocket('wss://domain.com/cable/users_1');

ws.onmessage = (e) => {
  console.log(e.data);
};

我们看到它在 ping,但是当我们触发广播时什么也没有收到。我还在配置文件中添加了这个:
  config.action_cable.url = 'wss://domain.com/cable'
  config.action_cable.disable_request_forgery_protection = true

有人知道为什么会这样吗?

最佳答案

我终于想出了如何解决我的问题。

解决您的问题

首先,就您而言,您缺少订阅 channel 的步骤。你必须send一个 JSON onopen你的 WebSocket 这样的:

JSON.stringify({
  command: 'subscribe',
  identifier: JSON.stringify({
    channel: 'MyNotificationChannel',
    user_id: userId
  })
})

这将触发 MyNotificationChannel类(class)subscribed方法通过 user_id作为参数( params[:user_id] )。

起源

然后是起源的问题,这是我的问题。

在 Rails 端打开 WebSocket 失败并显示以下消息:
Request origin not allowed: https://loc.mydom.com:28080

我的应用程序在 https://loc.mydom.com:3000/ 上运行并且我已经将正在运行的服务器用于监听端口 28080 的电缆。
无论如何,这里的重点是该消息显示了不被接受的来源。

在环境文件( config/environments/development.rb )中,您只需要添加 ActionCable.server.config.allowed_request_origins :
Rails.application.configure do
  # ...
  ActionCable.server.config.allowed_request_origins = [
    'https://loc.mydom.com:3000/', # My web front app
    'https://loc.mydom.com:28080'  # The phone app
  ]
  # ...
end

在此之后,我的 WebSocket 连接并且我正在接收更新。

关于ruby-on-rails - 无法通过远程源连接到 Action Cable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976301/

相关文章:

ruby-on-rails - 在 rails 插件之外无法访问 ActionCable channel

ruby-on-rails - 如何测试依赖于 Devise signed_in 的 Rails 5 助手? helper ,用 Minitest?

ruby-on-rails - Active Admin Gem - Rails 3.2.3,Heroku 错误日志

ruby-on-rails - Rails 格式化日期

ruby-on-rails - ActionCable - 无法升级到 WebSocket

ruby-on-rails - 乘客使用比预期更多的 PostgreSQL 连接

ruby-on-rails - Rails-使用外部 SOAP API 的最佳方式?

ruby-on-rails - Disqus SSO + RAILS 设计 gem

ruby-on-rails - Rails 5 ActionCable 错误描述和拒绝连接

ruby-on-rails - websocket 握手期间的 Rails ActionCable 错误