2016-03-24 2 views
0

Мое приложение имеет экспресс-сервер, прослушивающий один порт (process.env.PORT), а также я хочу, чтобы веб-сокет использовал другой порт. Я имел обыкновение использовать Экспресс 3 с этой установкой:Приложение NodeJS и socket.io на Heroku с 2 портами

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); 
}); 

Приведенный выше код работает отлично, как и при создании ioServer, не требуется никакого конкретного порта. Однако, после того, как я перешел на Экспресс 4 и начал использовать сервис 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.')); 
}); 

Эта новая установка не работает, потому что, когда я запустить приложение на Heroku, я получаю ошибка жалуясь, что тот же самый порт не может быть использован дважды:

Error: listen EADDRINUSE :::40854 

Абонентская до логики, по существу, то же самое для явного назначения порта в Express 4, за исключением, так почему мой код работает с экспресс 3, но не Экспресс 4? Как мне это исправить?

ответ

0

В вашем втором блоке кода вы не можете позвонить .listen() как на своем сервере, так и на свой объект приложения. В этом конкретном случае (так, как вы структурировали свой код) вы хотите только называть его на объекте server, а не на app.

Это код из 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") 

Кроме того, ваш первый блок кода не работает на двух портах. Как правило, дизайн для веб-сокетов, один порт используется как для ваших веб-запросов, так и для ваших соединений в Интернете. Сам веб-сервер разбивает два типа соединений на основе исходного соединения.