2

我知道那里有很多 Node JS 路由器框架,但我试图从一开始就学习这个概念,而不是重用代码。简而言之,我极其简单的路由器正在部分工作,但有一些问题。这是代码。

 function serverStart(urlRoute) {
    function onRequest(request, response) {
        var pathname = url.parse(request.url).pathname;
        console.log("Request received for " + pathname + ".");

        urlRoute(pathname, request, response);

        response.end();
    }

    http.createServer(onRequest).listen(8888);
    console.log("Server has started." );
 }

路由器代码:

function urlRoute(pathname, req, res) {
        console.log(pathname)
    switch(pathname) {
        case '/':
            console.log("Request for path '/'");
            res.writeHead(200, {"Content-Type": "text/plain"});
            res.write("In Index!");
        case '/start':
            console.log("Request for path '/start'");
            res.writeHead(200, {"Content-Type": "text/plain"});
            res.write("In Start!");
        case '/foo':
            console.log("Request for path '/foo'");
            res.writeHead(200, {"Content-Type": "text/plain"});
            res.write("In Foo!");
    default: // Default code IS working
            console.log("404");
            res.writeHead(404, {"Content-Type": "text/plain"});
            res.write("Default 404"); 
    }
}

默认和/或 404 部分可以正常工作,但其他部分不能。基本上,如果我请求索引页“/”,所有 case 语句都会触发,类似地,下一个 case 会自行触发以及它下面的所有内容。因此,“/foo”触发“foo”并将 404 写入控制台,但我没有得到 404 页面(当然,除非我完全使用了错误的 URL)。

试图理解为什么这个案子似乎表现得不正常。任何帮助,将不胜感激!

4

1 回答 1

1

您的条款break之间缺少陈述case。JavaScriptswitch语句从 C 和其他类似语言中借用了它们的行为,并且“失败”行为是它应该工作的方式(尽管这可能看起来是一个糟糕的想法)。

因此:

switch(pathname) {
    case '/':
        console.log("Request for path '/'");
        res.writeHead(200, {"Content-Type": "text/plain"});
        res.write("In Index!");
        break;
    case '/start':
        console.log("Request for path '/start'");
        res.writeHead(200, {"Content-Type": "text/plain"});
        res.write("In Start!");
        break;
    case '/foo':
        console.log("Request for path '/foo'");
        res.writeHead(200, {"Content-Type": "text/plain"});
        res.write("In Foo!");
        break;
    default: // Default code IS working
        console.log("404");
        res.writeHead(404, {"Content-Type": "text/plain"});
        res.write("Default 404"); 
}
于 2013-09-28T20:01:18.607 回答