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或者试试这个&#xFF1A;

 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&#x3002;

这个方法在当前的稳定版本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。 还要确保与其他软件包相同。