2016-03-24 13 views
0

私のアプリは、あるポート(process.env.PORT)でリッスンするエクスプレスサーバーを持っています。また、別のポートを使用するWebソケットも必要です。私は、このセットアップでエクスプレス3を使用するために使用される:ioServerを作成するときに、何の特定のポートが必要とされないよう2つのポートを持つHerokuのNodeJSとsocket.ioアプリケーション

var express   = require('express'), 
    http    = require('http'), 
    io    = require('socket.io'), 
    app    = express(); 
    server   = http.Server(app); 
    ioServer  = io(server); 

ioServer.on('connection', callback); 
server.listen(process.env.PORT || 3000, function() { 
    console.log('App listening on ' + server.address().port); 
}); 

上記のコードでは、うまく働きました。私は4を表現するために切り替えられ、HerokuのののWebSocketサービスを使用して開始した後、しかし、私はこのようなポートを指定する必要がありました:私はHerokuの上でアプリを実行したとき、私が得るため

var WebSocketServer = require('ws').Server, 
    port = 5000, 
    server = http.createServer(app); 
    server.listen(port); 

var wss = new WebSocketServer({server: server}); 

wss.on('connection', callback); 

app.listen(app.get('port'), function() { 
    console.log('Express server listening.')); 
}); 

この新しいセットアップ働くことはありませんエラー同じポートを2回使用することができないという文句:

Error: listen EADDRINUSE :::40854 

セットアップロジックが明確エクスプレス4にポートを割り当てるため除いて基本的に同じであるので、なぜ私のコードの作品は、Express 3で行ったではなく、エクスプレス4?私はこれをどのように修正すべきですか?

答えて

0

2番目のコードブロックでは、サーバーとアプリケーションオブジェクトの両方で.listen()に電話をかけることはできません。この特定のケース(コードを構造化した方法)では、appではなく、serverオブジェクトでのみ呼び出したいとします。

これは、このトピックのHeroku's dev pageからのコードです:

var WebSocketServer = require("ws").Server 
var http = require("http") 
var express = require("express") 
var app = express() 
var port = process.env.PORT || 5000 

app.use(express.static(__dirname + "/")) 

var server = http.createServer(app) 
server.listen(port) 

console.log("http server listening on %d", port) 

var wss = new WebSocketServer({server: server}) 
console.log("websocket server created") 

はまた、あなたの最初のコードブロックは、2つのポート上で実行されていません。通常はwebSocketの設計と同様に、WebリクエストとWebSocket接続の両方に単一のポートが使用されます。 Webサーバー自体は、最初の接続に基づいて2種類の接続を分割します。

関連する問題