2010-11-08 33 views
5

Tôi vừa mới bắt đầu học node.js. Tôi có mẫu (máy chủ) sau:node.js + kết nối lỗi 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"); }); 

Nếu tôi gọi/fail0 và/fail1 cùng một lúc, một trong số chúng sẽ thành công và lỗi kia không thành công với lỗi 404. gọi/success0 và success1 tuy nhiên hoạt động. Ai đó có thể khai sáng cho tôi tại sao một người làm việc và người khác thì không? Dưới đây là khách hàng của tôi thử nghiệm:


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

chạy trên lợi nhuận của khách hàng:

 
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

Vấn đề hấp dẫn. Tôi có thể tái tạo điều này ở đây nhưng tôi không chắc chắn làm thế nào để sửa chữa nó. Nó dường như xoay quanh việc tái sử dụng 'thất bại'. Nếu bạn sao chép 'fail' thành hai hàm' fail0' và 'fail1' thì nó hoạt động tốt. Phải là một cái gì đó để làm với Express hoặc kết nối router hoặc middleware logic nhưng tôi không thể phát hiện nó là gì. – RandomEtc

Trả lời

1

Dưới đây là giải thích về lỗi này (và một con trỏ tới một sửa chữa sau dưới đây).

Lý do là logic định tuyến của trạng thái lưu trữ thư viện kết nối (chỉ mục tuyến đường hiện tại) dưới dạng thuộc tính trong hàm gọi lại hàm. Trong trường hợp thử nghiệm của bạn, khi cuộc gọi lại được đăng ký cho tuyến thứ hai, '/ fail1', điều này sẽ ghi đè trạng thái được đặt bởi tuyến đường cho '/ fail0'. Yêu cầu đến cho fail0 do đó không thành công.

Lỗi này đã được báo cáo trên danh sách gửi thư nhanh trong this thread.

Bản sửa lỗi được cam kết trong this fork.