2010-11-08 62 views
5

我刚开始学习node.js.我有以下的(服务器)样本:node.js +连接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"); }); 

如果我打电话/ fail0同时/ FAIL1,他们中的一个会成功,另一个失败,404错误。然而,调用/ success0和success1可行。有人能告诉我为什么一个人工作,另一个人不工作?下面是我的测试客户端:


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

上述客户端返回运行:

 
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

有趣的问题。我可以在这里重现这一点,但我不知道如何解决它。它似乎取决于“失败”的重用。如果将'fail'克隆为两个函数'fail0'和'fail1',那么它就可以正常工作。必须与Express或Connect的路由器或中间件逻辑有关,但我无法确定它是什么。 – RandomEtc 2011-01-03 09:39:26

回答

1

这里是这个错误的解释(和指向修复下面如下)。

原因是Connect库的路由逻辑将状态(当前路由的索引)存储为函数回调中的一个属性。在你的测试案例中,当回调被注册为第二个路由'/ fail1'时,这个覆盖'/ fail0'路由设置的状态。因此传入的fail0请求失败。

此错误在this thread的快递邮件列表中报告。

解决方案是在this fork中提交的。