2010-11-08 81 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中提交的。