问题
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.
来源:https://stackoverflow.com/questions/11801882/node-js-express-3-socket-io-cant-set-headers-after-they-are-sent