我正在试图制作一个应用程序,在rails上为ruby使用ruby,reactjs为frontent。我希望有几个人会同时使用这个应用程序,应用程序应该不刷新页面或重定向到一些新的路线(除了登录,登出,注册...)。对于后端和前端之间的通信,我试图使用websockets,但在终端和浏览器的控制台中出现错误。这两个错误每秒重复一次左右。如何在轨道上的ruby和通过websockets reactJS之间发送数据
错误我在终端得到的是:
13:58:00 rails.1 | [ActionCable] [[email protected]] Finished "/cable/" [WebSocket] for 127.0.0.1 at 2017-05-04 13:58:00 +0200
13:58:00 rails.1 | [ActionCable] [[email protected]] There was an exception - NoMethodError(undefined method `fetch' for nil:NilClass)
13:58:00 rails.1 | [ActionCable] [[email protected]] /home/mislav/.rvm/gems/ruby-2.3.0/gems/actioncable-5.0.2/lib/action_cable/server/configuration.rb:25:in `pubsub_adapter'
13:58:00 rails.1 | /home/mislav/.rvm/gems/ruby-2.3.0/gems/actioncable-5.0.2/lib/action_cable/server/base.rb:76:in `block in pubsub'
...
# here are now a lot of errors like :
13:58:00 rails.1 | /home/mislav/.rvm/gems/ruby-2.3.0/gems/actioncable-5.0.2/lib/action_cable/channel/streams.rb:106:in `block in stop_all_streams'
13:58:00 rails.1 | /home/mislav/.rvm/gems/ruby-2.3.0/gems/actioncable-5.0.2/lib/action_cable/channel/streams.rb:105:in `each'
13:58:00 rails.1 | /home/mislav/.rvm/gems/ruby-2.3.0/gems/actioncable-5.0.2/lib/action_cable/channel/streams.rb:105:in `stop_all_streams'
...
14:01:09 rails.1 | /home/mislav/.rvm/gems/ruby-2.3.0/gems/concurrent-ruby-1.0.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:319:in `block in create_worker'
14:01:10 rails.1 | Started GET "/cable" for 127.0.0.1 at 2017-05-04 14:01:10 +0200
14:01:10 rails.1 | Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-05-04 14:01:10 +0200
14:01:10 rails.1 | Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
14:01:10 rails.1 | User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT $1 [["LIMIT", 1]]
14:01:10 rails.1 | [ActionCable] [[email protected]] Registered connection (Z2lkOi8vYXV0b2Nvb3JkMy9Vc2VyLzI)
14:01:10 rails.1 | +++++++++++++ subscribed method
最后一行是刚刚从渠道的认购方法看跌期权。正是在那里,所以我可以按照数据如何流动
错误,我得到的铬控制台:
Uncaught TypeError: Cannot read property 'received' of undefined
at t.notify (eval at <anonymous> (application.js:1187), <anonymous>:1:1715)
at t.message (eval at <anonymous> (application.js:1169), <anonymous>:1:1778)
的应用程序/渠道/ users_channel.rb看起来是这样的:
class UsersChannel < ApplicationCable::Channel
def subscribed
puts "+++++++++++++ subscribed method"
stream_from 'users_channel'
end
def speak(data)
puts "+++++++++++++++ speak method: #{data}"
ActionCable.server.broadcast 'users_channel', message: data['message']
end
end
并且获取数据并将数据发送到后端的部分反应组件(组件名称)如下所示:
...
componentDidMount() {
console.log("component did mount") //I see this in the console
this.props.cable.subscriptions.create('UsersChannel', {
message: "messsage",
connected: function() {
setTimeout(() => this.perform('speak',
{data: "some dataaaa"}),
1000);
},
received: function(data) {
console.log(data);
}
});
}
...
在我反应过来的根文件我有:
...
import ActionCable from 'action-cable-react'
var actionCable = ActionCable.ActionCable
var cable = actionCable.createConsumer('ws://localhost:5000/cable');
console.log(cable)
/*
console.log(cable) outpust:
n {url: "ws://localhost:5000/cable", subscriptions: t, connection: t, connectionMonitor: t}
> connection: t
> connectionMonitor: t
> subscriptions: t
> url: "ws://localhost:5000/cable"
*/
...
ReactDOM.render(
<Application cable={cable} />,
document.getElementById('application')
);
这是我第一次尝试使用WebSockets,我不知道发生了什么事情。我GOOGLE了一些关于这个主题的博客帖子和关于计算器的问题,但我无法获得 它的工作。如果能够帮助我从rails cabel和console.log中提取一些数据,我会非常感激。
谢谢!
这是不是一个真正的答案,但只是一个建议:结账http://ruby-hyperloop.io一切你想开箱即用,再加上你在ruby(客户端和服务器)中写下所有内容。如果你需要帮助,https://gitter.im/ruby-hyperloop/chat还有一个活跃的gitter社区 –
我建议你看看Ruby-on-Rails ActionCable客户端。与'socket.io'非常相似,ActionCable通过Websocket连接实现通信协议,与原始Web套接字不同。您可以使用中间件(例如['plezi'](http://www.plezi.io))或其他解决方案使用RoR的原始Web套接字。 – Myst