I'm new to learning node.js and seem to have run into an error that can't get to fix.
Its a very simple and beginners code so shouldn't need much explanation, more over it works fine on localhost, but breaks on production server.
App.js
var express = require('express')
, routes = require('./routes')
, http = require('http')
, path = require('path');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 8000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
app.get('/', routes.index);
var server = app.listen(8000);
var io = require('socket.io').listen(server);
server.listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
And here's the dreaded error!
http.js:644
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:644:11)
at ServerResponse.res.setHeader (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/patch.js:59:22)
at next (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/proto.js:153:13)
at Function.app.handle (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/proto.js:198:3)
at Server.app (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/connect.js:66:31)
at Manager.handleRequest (/home1/artalatc/public_html/cloud1/node_modules/socket.io/lib/manager.js:564:28)
at Server.<anonymous> (/home1/artalatc/public_html/cloud1/node_modules/socket.io/lib/manager.js:118:10)
at Server.EventEmitter.emit (events.js:115:20)
at HTTPParser.parser.onIncoming (http.js:1793:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)
Problem seems to be at var io = require('socket.io').listen(server);
because commenting this like removes the error.
What version of Node are you using?
I had the same problem when I was using 0.9.x. I downgraded Node to 0.8.4 and the problem seems to have gone away.
My best guess is something in Node has changed that Socket.io doesnt agree with.
upgrade express - 3.1.0 and socket.io - 0.9.13
it's ok on nodejs0.10
Which version of express are you using? Check out https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x or try this:
var server = app.listen(8000);
var io = require('socket.io').listen(server);
i was having the same issue mate
if you are using express 3.0 you should try this: http://codehenge.net/blog/2012/08/using-socket-io-with-express-3-x/
also check your version of node:
node --version
try using v0.8.9 or any other stable version
It helped me! And will help you
For anyone bumping in to this issue you should be using:
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
server.listen(8000);
As express no longer returns a HTTP instance that socket.io requires. See the updated README.md file on https://github.com/learnboost/socket.io for the express 2 and 3 examples.
This approach works in the current stable release 0.8.14:
var express = require('express')
, app = express()
, server = app.listen(8000)
, io = require('socket.io').listen(server);
I had the exact same issue. Incompatible versions of express and socket.io were to blame. Upgraded them to express 3.2.4 and socket.io 0.9.14 and works like a charm.
Or you can downgrade your socket.io to a previous version, but you'll have to figure that one out.
this error come because express internally use cache means for every second request data get from cache so it response back with 304 status code so use
app.disable('etag');
it tells the express each request fresh means with stautscode 200
Change socket.io dependency to 0.9.15 in package.json, run npm install
and it should fix your problem.