2010-11-08 17 views
5

Acabo de empezar a aprender node.js. Tengo siguiente (servidor) de la muestra:node.js + connect error 404


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

Si llamo/fail0 y/fail1 al mismo tiempo, uno de ellos tendrá éxito y el otro con error 404. calling/success0 y success1 sin embargo funciona. ¿Puede alguien aclararme por qué uno trabaja y el otro no? A continuación se muestra mi cliente prueba:


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

corriendo rentabilidad por encima del cliente:

 
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. Puedo reproducir esto aquí, pero no estoy seguro de cómo solucionarlo. Parece depender de la reutilización de 'fail'. Si clonas 'fail' en dos funciones' fail0' y 'fail1' entonces funciona bien. Debe ser algo relacionado con el enrutador o la lógica de middleware de Express o Connect, pero no puedo identificar de qué se trata. – RandomEtc

Respuesta

1

Aquí es una explicación de este error (y un puntero a una solución que sigue a continuación).

La razón es que la lógica de enrutamiento de la biblioteca de Connect almacena el estado (el índice de la ruta actual) como una propiedad en la devolución de llamada de la función. En su caso de prueba, cuando la devolución de llamada se registra para la segunda ruta, '/ fail1', esta anula el estado establecido por la ruta para '/ fail0'. Por lo tanto, una solicitud entrante de fail0 falla.

Este error se informó en la lista de correo urgente en this thread.

Se ha corregido una corrección en this fork.