2012-08-03 62 views
7

我是新学习node.js的人,似乎遇到了无法修复的错误。node.js + express 3 + socket.io =发送之后无法设置标题

它是一个非常简单和初学者的代码,所以不需要太多解释,更多的它可以在本地主机上正常工作,但在生产服务器上会中断。

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

张贴您的路线文件。该错误不是从index.jade文件 – c0deNinja 2012-08-03 19:19:18

+0

中添加的。这是一个自动生成的文件。 – user1574965 2012-08-03 19:22:25

+0

嗯等开发时没有错误,但只在prod? – c0deNinja 2012-08-03 19:23:49

回答

7

你使用的是什么版本的节点?

我在使用0.9.x时遇到了同样的问题。我将Node降级到0.8.4,问题似乎消失了。

我最好的猜测是Node中的东西改变了,Socket.io不同意。

+0

我做了一样。修复了这个问题。 – user1574965 2012-09-15 15:06:25

+2

有没有办法让它与更新版本的节点一起工作? – Magicode 2012-12-12 22:23:02

1

对于任何碰撞中,你应该使用这个问题:

var server = require('http').createServer(app); 
var io = require('socket.io').listen(server); 
server.listen(8000); 

由于表达不再返回socket.io需要一个HTTP的实例。请参阅https://github.com/learnboost/socket.io上更新的README.md文件,以获取快速2和3示例。

1

这种做法在当前的稳定版0.8.14工作:

var express = require('express') 
    , app = express() 
    , server = app.listen(8000) 
    , io = require('socket.io').listen(server); 
4

升级 快递 - 3.1.0和socket.io - 0.9.13

它是在nodejs0 OK .10

+0

这是我的解决方案。谢谢! 节点v0.10.0,Express 3.1.0和Socket.io 0.9.13。 – 2013-04-08 05:07:10

0

我有完全相同的问题。 express和socket.io的不兼容版本是怪罪。升级它们以表达3.2.4和socket.io 0.9.14并且像魅力一样工作。

或者你可以将你的socket.io降级到以前的版本,但你必须找出一个。

0

这个错误来,因为在内部表示使用缓存装置每秒请求数据从缓存中获取,因此响应回来了304状态代码,以便使用

app.disable('etag'); 

它告诉Express中的每个请求的新鲜手段与stautscode 200

0

将package.json中的socket.io依赖项更改为0.9.15,运行npm install,它应该可以解决您的问题。

0

运行NPM列表socket.io

确保它不会显示如下无效,

[email protected]无效

NPM ERR!无效:[email protected] c:\用户....

如果你得到这个错误,npm install socket.io。 还要确保与其他软件包相同。

相关问题