2017-05-04 24 views
2

我正在试图制作一个应用程序,在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中提取一些数据,我会非常感激。

谢谢!

+1

这是不是一个真正的答案,但只是一个建议:结账http://ruby-hyperloop.io一切你想开箱即用,再加上你在ruby(客户端和服务器)中写下所有内容。如果你需要帮助,https://gitter.im/ruby-hyperloop/chat还有一个活跃的gitter社区 –

+1

我建议你看看Ruby-on-Rails ActionCable客户端。与'socket.io'非常相似,ActionCable通过Websocket连接实现通信协议,与原始Web套接字不同。您可以使用中间件(例如['plezi'](http://www.plezi.io))或其他解决方案使用RoR的原始Web套接字。 – Myst

回答

1

看到我上面的评论。由于必要的调试量很难回答你的问题。但是,如果你不能使用http://ruby-hyperloop.io那么我的建议是使用推进器作为你的websocket传输。 (请参阅pusher-faker gem),它很容易设置,而且我发现诊断系统问题要容易得多。一旦你开始工作,你可以切换回行动电缆。

我知道这是不是一个伟大的答案,但它是我会做什么:-)

相关问题