使用Faye-Rails gem发布错误

时间:2015-07-29 14:30:20

标签: ruby-on-rails faye

我使用faye-rails gem在我的前端的javascript和我的rails服务器之间进行异步消息传递。我可以使用curl发送消息并让javascript打印出来,所以我知道faye服务器正在运行。我也可以像这样收听服务器上的消息:

# In application.rb
config.middleware.use FayeRails::Middleware, mount: '/bayeux', :timeout => 25 do
  map '/async/**' => FayeController
  map :default => :block
end

# In faye_controller.rb
class FayeController < FayeRails::Controller
  channel '/async/test' do
    subscribe do
      puts "Received on channel #{channel}: #{message.inspect}"
    end
  end
end

然后我收到通过curl -X POST localhost:3000/bayeux -H 'Content-Type: application/json' -d '{"channel": "/async/test", "data": "test123"}'发送的消息并获得预期的输出。但是,我似乎无法从服务器内发送消息。我期望这样的事情在订阅块中工作(因此它将作为对任何消息的响应发送):

FayeController.publish '/async/test', :response => 'something'

但是这会导致整个服务器崩溃:

in '+': no implicit conversion of nil into Array (TypeError)

然后是堆栈跟踪。这是我的错 - 我没有正确设置或误读文档吗?或者它是宝石中的错误,在这种情况下,是否有人有解决方法?

由于底层faye库中存在错误,我实际上已经使用了一个解决方法,请参阅here

1 个答案:

答案 0 :(得分:1)

您可以使用服务器上的HTTP请求(如curl)发布到faye服务器

    uri = URI.parse("http://localhost:3000/bayeux")
    begin
      Net::HTTP.post_form(uri, response: 'something')
    rescue Errno::ECONNREFUSED
      puts "Pushing to Faye Failed"
    end

---------更新--------------------------

以前的代码需要在另一个线程中运行以防止死锁(例如,使用resque在后​​台作业中运行它)

您可以使用以下内容在同一个帖子中发布

 client = Faye::Client.new('http://localhost:3000/bayeux')
 client.publish('/async/test', {response: "something"})