新しい Heroku'cedar ' スタックの1つにアップロードした単純なsocket.ioチャットアプリケーションがあります。
今ではほとんどすべてが機能していますが、つまずきが1つあります。ローカルホストで、クライアントからソケットサーバーへの接続を次のように開きます。
// lots of HTML omitted
socket = new io.Socket('localhost', {port: 8888});
しかし、Herokuでは、明らかにこれらの値を別のものに置き換える必要があります。
次のように、サーバー上のプロセスオブジェクトからポートを取得できます。
port = process.env.PORT || 8888
それをビューに渡します。
しかし、'localhost'
の代わりに何を使用すればよいですか?
これは2013年10月の時点で変更され、herokuはWebSocketのサポートを追加しました。
https://devcenter.heroku.com/articles/node-websockets
使用する:
heroku labs:enable websockets
WebSocketを有効にし、削除することを忘れないでください:
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
Herokuの article による正しい方法は次のとおりです。
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
socket = new io.Socket();
これにより、io.SocketがWebSocketを使用しようとしないことが保証されます。
次の手順を実行することで、Socket.IOv0.8をHerokuCedarで動作させることができました。
Expressアプリ内(私の場合はCoffeeScript内):
app = express.createServer();
socket = require("socket.io")
...
io = socket.listen(app);
io.configure () ->
io.set("transports", ["xhr-polling"])
io.set("polling duration", 10)
io.sockets.on('connection', (socket) ->
socket.on('myaction', (data) ->
...
socket.emit('result', {myData: data})
### The port setting is needed by Heroku or your app won't start
port = process.env.PORT || 3000;
app.listen(port);
そしてアプリケーションの正面向きのJavascript内:
var socket = io.connect(window.location.hostname);
function sendSocketRequest() {
socket.emit('myaction', $("#some_field").val());
}
socket.on('result', function(data) {
console.log(data);
}
便利なリンク:
太陽の下ですべての組み合わせを試した後、私はついにそれを空白のままにしました。見よ、それは完璧に機能する。ポートも必要ありません。
socket = new io.Socket();
私もherokuでこの問題を抱えていました。ホスト名「myapp.herokuapp.com」(または単にwindow.location.hostnameを使用して、ローカルと本番環境の両方で機能する)を使用し、ポートを80に設定して機能させることができました。SocketIO0.6.0を使用しています。
2011-06-25T21:41:31+00:00 heroku[router]: Error H13 (Connection closed without response) -> GET appxxxx.herokuapp.com/socket.io/1/websocket/4fd434d5caad5028b1af690599f4ca8e dyno=web.1 queue= wait= service= status=503 bytes=
これは、アプリの前にあるherokuルーターがWebソケットトラフィックを処理するように構成されていないことを意味しているのでしょうか?
[update]2011年6月22日の時点で、答えは「はい」と表示されます... herokuはsocket.ioをサポートしていませんこの投稿を参照してください:- http://blog.heroku.com/archives/2011/6/22/the_new_heroku_2_node_js_new_http_routing_capabilities/
実際のホスト名を入れてみませんか?