Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node.js + express 3 + socket.io = Can't set headers after they are sent

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.

like image 578
user1574965 Avatar asked Aug 03 '12 19:08

user1574965


2 Answers

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.

like image 129
Ghosty Avatar answered Oct 10 '22 23:10

Ghosty


upgrade express - 3.1.0 and socket.io - 0.9.13

it's ok on nodejs0.10

like image 45
feng.yin Avatar answered Oct 10 '22 21:10

feng.yin