2010-11-08 3 views
5

Ho appena iniziato ad imparare node.js. Ho seguito (server) del campione:node.js + connect 404 error


var app = require("express").createServer(); 
app.listen(80); 

function fail(req, res, next) { setTimeout(next, 10); } 
function success() { 
    return function(req, res, next) { setTimeout(next, 10); }; 
} 
app.get("/success0", success(), function(req, res, next) { res.send("0"); }); 
app.get("/success1", success(), function(req, res, next) { res.send("1"); }); 
app.get("/fail0", fail, function(req, res, next) { res.send("0"); }); 
app.get("/fail1", fail, function(req, res, next) { res.send("1"); }); 

Se chiamo/fail0 e/fail1 contemporaneamente, uno di loro successo e l'altra non riesce con 404 errori. chiamare/success0 e success1 tuttavia funziona. Qualcuno può illuminarmi perché uno lavora e l'altro no? Qui di seguito è il mio cliente di prova:


var http = require("http"); 
var sys = require("sys"); 

for(var i = 0; i < 10; i++) { 
    var io = http.createClient(80, "localhost"); 
    var request = io.request("GET", "/fail" + (i%2), {host:"localhost"}); 
    request.on("response", function(response) { 
     var body = ""; 
     response.on("data", function(data) { body += data; }); 
     response.on("end", function() { 
      sys.puts(response.statusCode + ":" + body); 
     }); 
    }).end(); 
} 

che corre sopra i rendimenti dei clienti:

 
404:Cannot GET /fail0 
200:1 
404:Cannot GET /fail0 
200:1 
404:Cannot GET /fail0 
200:1 
404:Cannot GET /fail0 
200:1 
404:Cannot GET /fail0 
200:1 
+1

Problema intrigante. Posso riprodurre questo qui ma non sono sicuro di come risolverlo. Sembra incentrato sul riutilizzo di "fallire". Se clonate 'fail' in due funzioni' fail0' e 'fail1', allora funziona bene. Deve avere qualcosa a che fare con il router o la logica del middleware di Express o Connect, ma non riesco a individuare cosa sia. – RandomEtc

risposta

1

Ecco una spiegazione di questo bug (e un puntatore a una correzione segue sotto).

Il motivo è che la logica di routing della libreria Connect memorizza lo stato (l'indice della rotta corrente) come una proprietà nella funzione callback. Nel tuo caso di test, quando il callback è registrato per il secondo percorso, '/ fail1', questo sovrascrive lo stato impostato dal percorso per '/ fail0'. Pertanto, una richiesta in arrivo per fail0 non riesce.

Questo errore è stato segnalato nella mailing list express in this thread.

Una correzione è stata commessa in this fork.