发布错误与Faye-Railsgem

Publish errors with the Faye-Rails gem

我正在使用 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)

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

由于底层 faye 库中的错误,我实际上已经不得不使用一种解决方法,请参阅 here

您可以使用来自您服务器的 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"})