2012-08-03 5 views
7

Ich bin neu beim Lernen von node.js und habe anscheinend einen Fehler bekommen, der nicht behoben werden kann.node.js + express 3 + socket.io = Kopfzeilen können nach dem Senden nicht gesetzt werden

Es ist ein sehr einfacher und Anfänger-Code, so sollte nicht viel Erklärung, mehr über es funktioniert gut auf localhost, aber bricht auf Produktionsserver.

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')); 
}); 

Und hier ist der gefürchtete Fehler!

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 scheint bei var io = require('socket.io').listen(server); zu sein, weil diese wie kommentieren Sie den Fehler beseitigt.

+0

posten Sie Ihre Routes-Datei. Der Fehler ist nicht von der index.jade Datei – c0deNinja

+0

Hinzugefügt. Dies ist eine automatisch generierte Datei. – user1574965

+0

hmmm und so keine fehler bei der entwicklung aber nur in prod? – c0deNinja

Antwort

7

Welche Version von Knoten verwenden Sie?

Ich hatte das gleiche Problem, als ich 0.9.x. Ich habe Node auf 0.8.4 heruntergestuft und das Problem scheint weggegangen zu sein.

Meine beste Vermutung ist etwas in Node hat sich geändert, dass Socket.io nicht einverstanden ist.

+0

Ich tat das Gleiche. Das Problem wurde behoben. – user1574965

+2

Gibt es eine Möglichkeit, es mit neueren Versionen von Knoten arbeiten zu lassen? – Magicode

1

Für alle zu diesem Thema stoßen in die Sie verwenden sollten:

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

As Express nicht mehr gibt eine HTTP-Instanz, die erfordert Socket.io. Sehen Sie die aktualisierte Datei README.md unter https://github.com/learnboost/socket.io für die Express 2 und 3 Beispiele.

1

Dieser Ansatz in der aktuellen stabilen Version arbeitet 0.8.14:

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

Upgrade express - 3.1.0 und socket.io - 0.9.13

es ist in Ordnung, auf nodejs0 .10

+0

Das war die Lösung für mich. Vielen Dank! Knoten v0.10.0, Express 3.1.0 und Socket.io 0.9.13. –

0

Ich hatte genau das gleiche Problem. Inkompatible Versionen von express und socket.io waren schuld. Verbesserte sie, um 3.2.4 auszudrücken und socket.io 0.9.14 und funktioniert wie ein Charme.

Oder Sie können Ihre socket.io auf eine vorherige Version herunterstufen, aber Sie müssen das herausfinden.

0

dieser Fehler kommen, weil intern ausdrücken verwenden Cache bedeutet für jede Sekunde Anforderungsdaten aus dem Cache erhalten, so dass es so mit 304 Statuscode Antwort zurück

app.disable('etag'); 

verwenden sie die ausdrückliche jede Anforderung frische Mittel mit stautscode sagt 200

0

Ändern Sie socket.io Abhängigkeit zu 0.9.15 in package.json, führen Sie npm install und es sollte Ihr Problem beheben.

0

Führen Sie einen npm Liste socket.io

Achten Sie darauf, es nicht wie unten, ERR

[email protected] ungültig

npm ungültig macht mit! ungültig: [email protected] c: \ Benutzer ....

Wenn Sie diesen Fehler erhalten, installiert npm socket.io. Stellen Sie auch das gleiche mit anderen Paketen sicher.