我刚开始学习node.js。我有以下(服务器)示例:
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"); });
如果我同时调用/fail 0和/fail 1,其中一个会成功,另一个会失败并出现404错误。调用/success 0和success 1可以正常工作。有人能告诉我为什么一个有效而另一个无效吗?下面是我的测试客户:
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条答案
按热度按时间qnakjoqk1#
下面是这个bug的解释(下面是一个修复的指针)。
原因是Connect库的路由逻辑将状态(当前路由的索引)作为一个属性存储在函数回调中。在您的测试用例中,当为第二个路由'/fail 1'注册回调时,这个路由将覆盖路由为'/fail 0'设置的状态。因此,对fail 0的传入请求失败。
此错误已在this thread的快速邮件列表中报告。
已在this fork中提交修复程序。