node.js + express 3 + socket.io = Can't set he

2019-02-17 03:50发布

问题:

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.

回答1:

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.



回答2:

upgrade express - 3.1.0 and socket.io - 0.9.13

it's ok on nodejs0.10



回答3:

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


回答4:

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



回答5:

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.



回答6:

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


回答7:

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.



回答8:

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



回答9:

Change socket.io dependency to 0.9.15 in package.json, run npm install and it should fix your problem.



回答10:

Run a npm list socket.io

Make sure it doesn't show invalid as below,

─ socket.io@0.9.10 invalid

npm ERR! invalid: socket.io@0.9.10 c:\Users....

If you get this error, npm install socket.io. Also make sure the same with other packages.