node.js + express 3 + socket.io =发送后无法设置标题
我刚刚学习node.js,似乎遇到了一个无法修复的错误。
它是一个非常简单的和初学者的代码,所以不需要太多的解释,更多的它可以在本地主机上正常工作,但在生产服务器上打破。
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 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)
问题似乎在var io = require('socket.io').listen(server);
因为像这样的评论会消除错误。
你使用的是什么版本的节点?
我在使用0.9.x时遇到同样的问题。 我把Node降级到0.8.4,问题似乎已经消失了。
我最好的猜测是在Node中改变了Socket.io不同意的。
升级express – 3.1.0和socket.io – 0.9.13
在nodejs0.10上可以
你使用哪个版本的快递? 看看https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x或者试试这个:
var server = app.listen(8000); var io = require('socket.io').listen(server);
我有同样的问题队友
如果你使用Express 3.0,你应该试试这个: http : //codehenge.net/blog/2012/08/using-socket-io-with-express-3-x/
还要检查你的节点版本:
node --version
尝试使用v0.8.9或任何其他稳定的版本
它帮助了我! 并会帮助你
对于任何人碰到这个问题,你应该使用:
var server = require('http').createServer(app); var io = require('socket.io').listen(server); server.listen(8000);
如express不再返回socket.io所要求的HTTP实例。 请参阅https://github.com/learnboost/socket.io上更新的README.md文件,了解示例2和3。
这个方法在当前的稳定版本0.8.14中起作用:
var express = require('express') , app = express() , server = app.listen(8000) , io = require('socket.io').listen(server);
我有完全相同的问题。 express和socket.io的不兼容版本是怪罪。 升级他们expression3.2.4和socket.io 0.9.14和作品像一个魅力。
或者你可以将你的socket.io降级到以前的版本,但是你必须弄清楚这一点。
这个错误来了,因为内部使用caching的手段,每隔一秒从caching请求数据,所以它使用304状态码作为回应
app.disable('etag');
它用stautscode 200告诉expression每个请求的新手段
在package.json中将socket.io依赖关系改为0.9.15,运行npm install
,它会解决你的问题。
运行一个npm列表socket.io
确保它不显示无效如下,
─socket.io@0.9.10无效
npm ERR! 无效:socket.io@0.9.10 c:\用户….
如果你得到这个错误,npm install socket.io。 还要确保与其他软件包相同。