アプリで情報をリアルタイムでプッシュするために Cramp をいじっています。ローカルではすべてうまく機能していますが、herokuにプッシュすると、ポートに問題があるようです。
websocket から継承する cramp にソケットをセットアップしました
class LiveSocket < Cramp::Websocket
また、基本的にホームページ用にいくつかのerbをレンダリングするだけのホームと呼ばれるクランプアクションもあります
class HomeAction < Cramp::Action
私のルートファイルでは、次のものと静的ファイルサーバーをセットアップしました
Rack::Builder.new do
puts "public file at #{File.join(File.dirname(__FILE__), '../public')}"
file_server = Rack::File.new(File.join(File.dirname(__FILE__), 'public'))
routes = HttpRouter.new do
add('/').to(HomeAction)
get('/LiveSocket').to(LiveSocket)
end
run Rack::Cascade.new([file_server, routes])
end
次に、クライアント側でJavaScriptが接続します
var ws = new WebSocket("ws://<%= request.host_with_port %>/LiveSocket");
私がローカルで言うように、それはすべて機能します。接続して、サーバーからの通知の受信を開始します。heroku では、Cedar スタックで薄く実行し、次のようなプロファイルを持っています。
web: bundle exec thin --timeout 0 start -p $PORT
サイトをロードすると、ページ自体は正常にロードされますが、websocket に接続しようとすると、次のエラーが表示されます
servername.herokuapp.com Unexpected response code: 200
これは、heroku がリクエストをルーティングする方法と関係があると推測していますが、heroku で node.js Websocket サーバーを実行できることはわかっているので、これも機能させる方法があるはずです。
助けてくれてありがとう。
乾杯
スチュアート