7

我是学习 node.js 的新手,似乎遇到了无法修复的错误。

它是一个非常简单的初学者代码,因此不需要太多解释,更多的是它在本地主机上运行良好,但在生产服务器上中断。

应用程序.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);因为评论这个就像删除了错误。

4

10 回答 10

7

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

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

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

于 2012-08-13T15:02:49.910 回答
4

升级 express - 3.1.0 和 socket.io - 0.9.13

在nodejs0.10上没问题

于 2013-03-14T03:24:50.677 回答
2

我遇到了同样的问题

如果你使用的是 express 3.0,你应该试试这个: http ://codehenge.net/blog/2012/08/using-socket-io-with-express-3-x/

还要检查您的节点版本:

node --version

尝试使用 v0.8.9 或任何其他稳定版本

它帮助了我!并且会帮助你

于 2012-09-26T14:41:43.810 回答
2

你用的是哪个版本的快递?查看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);
于 2012-08-04T16:14:15.563 回答
1

对于遇到此问题的任何人,您应该使用:

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 文件以获取 express 2 和 3 示例。

于 2012-09-26T14:09:09.520 回答
1

此方法适用于当前稳定版本 0.8.14:

var express = require('express')
  , app = express()
  , server = app.listen(8000)
  , io = require('socket.io').listen(server);
于 2012-11-01T04:22:45.650 回答
0

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

于 2014-01-10T23:54:49.150 回答
0

出现此错误是因为 express 在内部使用缓存意味着每秒从缓存中获取数据的请求数据,因此它以 304 状态代码响应,因此请使用

app.disable('etag');

它用 stautscode 200 告诉快递每个请求新鲜的意思

于 2013-12-15T05:27:54.653 回答
0

我有完全相同的问题。express 和 socket.io 的不兼容版本是罪魁祸首。将它们升级为 express 3.2.4 和 socket.io 0.9.14 并且像一个魅力一样工作。

或者你可以将你的 socket.io 降级到以前的版本,但你必须弄清楚那个。

于 2013-05-21T07:59:34.723 回答
0

运行 npm list socket.io

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

─ socket.io@0.9.10 无效

npm 错误!无效:socket.io@0.9.10 c:\Users....

如果您收到此错误,请 npm install socket.io。还要确保与其他包相同。

于 2016-08-23T18:24:02.890 回答