This is the following code of my app.js:
var port = process.env.PORT || 3000;
var app = require('express').createServer();
var io = require('socket.io').listen(app);
app.listen(port);
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
var spaces = {};
app.get('/', function (req, res) {
res.sendfile(__dirname + '/view.html');
});
app.get('/img/rocket.svg', function (req, res) {
res.sendfile(__dirname + '/img/rocket.svg');
});
app.get('/:spaceid', function (req, res) {
res.sendfile(__dirname + '/control.html');
});
io.sockets.on('connection', function (socket) {
socket.on('serve', function(data) {
spaces[data.spaceId] = socket;
});
socket.on('control', function (data) {
var spaceSocket = spaces[data.spaceId];
if (spaceSocket) {
spaceSocket.emit('control', data);
}
});
});
This is what I get when I do heroku logs
2013-05-17T18:18:06.873629+00:00 heroku[web.1]: Starting process with command `node app.js`
2013-05-17T18:18:07+00:00 app[web.1]: Warning: express.createServer() is deprecated, express
2013-05-17T18:18:08+00:00 app[web.1]: applications no longer inherit from http.Server,
2013-05-17T18:18:08+00:00 app[web.1]: please use:
2013-05-17T18:18:08+00:00 app[web.1]:
2013-05-17T18:18:08+00:00 app[web.1]: var express = require("express");
2013-05-17T18:18:08+00:00 app[web.1]: var app = express();
2013-05-17T18:18:08+00:00 app[web.1]:
2013-05-17T18:18:09+00:00 app[web.1]: Socket.IO's `listen()` method expects an `http.Server` instance
2013-05-17T18:18:09+00:00 app[web.1]: as its first parameter. Are you migrating from Express 2.x to 3.x?
2013-05-17T18:18:08.076300+00:00 heroku[web.1]: State changed from starting to up
2013-05-17T18:18:09+00:00 app[web.1]: If so, check out the "Socket.IO compatibility" section at:
2013-05-17T18:18:09+00:00 app[web.1]: https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
2013-05-17T18:18:09+00:00 app[web.1]: info: socket.io started
2013-05-17T18:18:09.745293+00:00 heroku[router]: at=error code=H18 desc="Request Interrupted" method=GET path=/ host=myapp123.herokuapp.com fwd="80.47.193.237" dyno=web.1 connect=1ms service=0ms status=503 bytes=0 sock=client
2013-05-17T18:18:11.428152+00:00 heroku[router]: at=error code=H18 desc="Request Interrupted" method=GET path=/ host=myapp123.herokuapp.com fwd="80.47.193.237" dyno=web.1 connect=1ms service=0ms status=503 bytes=0 sock=client
I've researched that can't use WebSockets and have to configure it differently. I'm unsure if I have that correctly. Can anyone spot any mistakes in the code? Please bear in mind I'm learning this stuff at the moment.
Your problem is exactly what the error states. Use this instead:
var express = require('express');
var app = express();
var http = require('http')
var server = http.createServer(app)
var io = require('socket.io').listen(server);
server.listen(80);
The problem with your application is that socket.io is looking for an instance of http.Server, and Express changed its API when version 3 was released. Notice these errors:
Warning: express.createServer() is deprecated, express
applications no longer inherit from http.Server
Socket.IO's `listen()` method expects an `http.Server` instance
as its first parameter. Are you migrating from Express 2.x to 3.x?
Starting an app the way you showed originally did return an instance of http.Server, but that has since changed. Here is a list of things changed from Express 2 to 3. Here's the straight quote:
Keep in mind that the return value of express() is no longer an http.Server instance.
The method was deprecated in this commit. You also may find this commit of interest. Aside from that, websockets do indeed fail to work on Heroku, so your settings are correct.