2013-04-09 12 views
6

ich dieses Stück Code haben:Antrag nicht in node.js Endung (zur Arbeit)

var app = require('http').createServer(function(req, res){ 
    console.log(req); 
    req.addListener('end', function() { 
     fileServer.serve(req, res); 

    }); 
}); 

var statics = require('node-static'); 
var fileServer = new statics.Server('./'); 

app.listen(1344, '127.0.0.1'); 

app.on('error', function(err){ 
    console.log(err); 
}) 

Es war ganz gut funktioniert, bis ich ein paar Änderungen vorgenommen, wird der Knoten einen Fehler gibt, und wenn Ich ging zurück, dieser Fehler war nicht mehr da, aber anstatt wie früher zu arbeiten, wurde das end Ereignis nicht ausgelöst. Also, alles innerhalb req.addListener('end', function(){}); wird nicht aufgerufen.

Und auch wenn ich eine andere node.js, die das gleiche Ereignis verwendet, wird auch nicht gefeuert. So ist es, wenn das Endereignis der Anfrage unterbrochen wird. Aber wie kann das möglich sein?

Ist nicht das erste Mal passiert. Letztes Mal habe ich den Knoten neu installiert (nachdem ich viele verschiedene Dinge probiert habe). Ich würde lieber eine Lösung finden, damit ich das Problem verstehen kann!

HINWEIS: Der ursprüngliche Code gehören socket.io und andere Art von Verbindungen, aber ich habe gerade den Code eingefügt, wo die App fest ist.

Es könnte auch nützlich sein zu wissen, wie das Problem zu debuggen!

+0

versuchen mit 'Knoten v0.8.x' oder lesen Stream2 Documenation in http://nodejs.org – InspiredJW

+0

ich nicht sprechen kann, ob' fileServer.serve' funktioniert, aber wenn Sie nehmen alles auf, was mit 'node-static' zu tun hat, Ihr Code funktioniert so wie er ist und das 'end'-Event wird definitiv aufgerufen. Ich erinnere mich daran, Probleme mit 'node-static' zu haben und Sie könnten besser die statische Middleware von Connect verwenden, wenn das Ihr Problem ist. http://www.senchalabs.org/connect/static.html –

+0

@InspiredJW Ich bin auf v0.10.3. Willst du sagen, ich sollte downgraden? – limoragni

Antwort

13

@InspiredJW sollte Anerkennung dafür bekommen, dass ich darauf hingewiesen habe, da ich es vergessen hatte, aber zweifellos ist Ihr Problem wegen der Änderungen in den lesbaren Streams. Damit das Ereignis end aufgerufen werden kann, müssen Sie entweder einen Listener an das Ereignis data anhängen oder Sie müssen stream.resume() anrufen.

require('http').createServer(function(req, res){ 
    req.addListener('end', function() { 
     // won't ever get called in node v0.10.3 
    }); 
}); 

require('http').createServer(function(req, res){ 
    req.addListener('end', function() { 
     // will get called in node v0.10.3 because we called req.resume() 
    }); 
    req.resume(); 
}); 

require('http').createServer(function(req, res){ 
    req.on('data', function (chunk) { }); 

    req.addListener('end', function() { 
     // also will get called because we attached a data event listener 
    }); 
}); 

http://nodejs.org/api/stream.html#stream_compatibility

+0

Großartig. Arbeitet jetzt. Was ich nicht verstehen kann, ist, wie kommt es an erster Stelle! Ich bin neu bei node.js Ich werde viel lesen müssen, damit die Dinge funktionieren. Kennst du ein gutes Buch über Knoten? Ich weiß, dass Apress an einem arbeitet, aber ich würde lieber sofort einen haben. Vielen Dank! – limoragni

+0

Tut mir leid. Ich habe gerade Knoten gelernt, indem ich es benutze. Es hat wahrscheinlich vorher funktioniert, weil entweder ein "Daten" -Ereignis-Listener angeschlossen war oder Sie eine ältere Knotenversion verwendet haben. –

+0

@limoragni Sie haben den Knoten wahrscheinlich auf v0.10.3 oder höher aufgerüstet, und das hat dazu geführt, dass er nicht mehr funktioniert. – Chev