我已经在我们的 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/