我使用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。
答案 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"})