node.js + express 3 + socket.io =发送后不能设置头文件 [英] node.js + express 3 + socket.io = Can't set headers after they are sent
问题描述
它的一个非常简单的初学者代码所以不需要太多的解释,更重要的是它在本地主机上工作正常,但在生产服务器上断开。
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')) ;
});
这里是可怕的错误!
http.js:644
throw new错误('发送后不能设置头文件');
^
错误:发送后不能设置标题。
在ServerResponse.OutgoingMessage.setHeader(http.js:644:11)
在ServerResponse.res.setHeader(/ home1 / artalatc / public_html / cloud1 / node_modules / express / node_modules / connect / lib / patch .js:59:22)
在下一个(/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/proto.js:153:13)
在Function.app。 handle(/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/proto.js:198:3)
在Server.app(/ home1 / artalatc / public_html / cloud1 / node_modules / express $ / $ / $ /
在服务器。< anonymous> (/home1/artalatc/public_html/cloud1/node_modules/socket.io/lib/manager.js:118:10)
在Server.EventEmitter.emit(events.js:115:20)
在HTTPParser.parser.onIncoming(http.js:1793:12)
在HTTPParser.parserOnHeadersComplete [as onHeadersComplete](http.js:111:23)
问题似乎在 var io = require('socket.io')。listen(server);
因为
您正在使用哪个版本的Node?
当我使用0.9.x时,我遇到了同样的问题。我将Node降级到0.8.4,问题似乎已经消失了。
我最好的猜测是Node已经改变了,Socket.io不同意。 p>
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.
这篇关于node.js + express 3 + socket.io =发送后不能设置头文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!