Node.js - 在同一个端口上使用 Socket.io 和 Express

Posted

技术标签:

【中文标题】Node.js - 在同一个端口上使用 Socket.io 和 Express【英文标题】:Node.js - Using Socket.io and Express on the Same Port 【发布时间】:2015-04-28 01:32:26 【问题描述】:

我需要重构这个节点应用程序,以便 socket.io 和 express 使用相同的端口,我可以部署它。它目前按原样运行,但不会在 Heroku 上运行,除非一切都使用相同的端口。

var http = require('http');
var socket = require('socket.io');
var socketServer = http.createServer(app);
var io = socket.listen(socketServer);

var express = require('express');

var app = express();

var bodyParser = require('body-parser');
var path = require('path');

app.set('view engine', 'jade');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded( extended: false ));

// parse application/json
app.use(bodyParser.json());

app.use(express.static(path.join(__dirname, 'public')));

var routes = require('./config/routes')(app, io);
var timer = require('./server/timer')(app, io);

var server = app.listen(process.env.PORT || 5000, function () 
    console.log('Server running on *:5000');
);

socketServer.listen(8000);

我也只是在学习节点,因此非常感谢任何有关重构的技巧。

已编辑以匹配建议的解决方案: (Express 以这种方式工作,但它破坏了 socket.io)

var express = require('express');
var app = express();
var serv = require('http').createServer(app);
var io = require('socket.io').listen(serv);

var bodyParser = require('body-parser');
var path = require('path');

app.set('view engine', 'jade');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded( extended: false ));

// parse application/json
app.use(bodyParser.json());

app.use(express.static(path.join(__dirname, 'public')));

var routes = require('./config/routes')(app, io);
var timer = require('./server/timer')(app, io);

serv.listen(process.env.PORT || 5000, function () 
    console.log('Server running on *:' + (process.env.PORT || '5000'));
);

这是控制台中的新错误:

socket.io-1.3.4.js:2 GET http://localhost:8000/socket.io/?user=Trey&EIO=3&transport=polling&t=1424902016787-2

看起来 websockets 失败了,所以它回退到长轮询,这也失败了......

【问题讨论】:

【参考方案1】:

我认为这应该可行。

var express = require('express')
var app = express()
var server = require('http').createServer(app)
var io = require('socket.io')(server)

server.listen(80);

Heroku 也有一些关于这个主题的有用信息:heroku dev info websockets

【讨论】:

谢谢,但我无法让它工作。 Express 仍然以这种方式工作,但它破坏了 socket.io。 对不起,这毕竟是对的。问题出在客户端(为我的套接字指定了错误的端口。谢谢!

以上是关于Node.js - 在同一个端口上使用 Socket.io 和 Express的主要内容,如果未能解决你的问题,请参考以下文章

Node.js端口兼容性

如何在端口 80 上运行 Node.js?

使用 Node.js 打开 23 端口读取数据

如何将 REST 与 Node.js 和 AngularJS 一起使用在不同的端口上?

如何使用 Amazon Elastic Beanstalk 在端口 80 上安全地运行 Node.js 服务器?

我应该 node.js 监听哪些端口?如何以及为啥?