1

我来自龙卷风,在那里你有一个 requestHandler 类,你匹配查询以将其定向到正确的 requestHandler。

你在 node.js 中表现如何?之类的????

http=require ('http');
url=require('url')


function case1(request,response){ ... }

function case2(request,response){ ... }

http.createServer(function(request, response) {
     var q=url.parse(request.url, true).query
     switch(true){
       case /friend/.test(q):
           case1(request,response);
           return;
       case /foes/.test(q):
           case2(request,response);
           return;
     }
}).listen(9999)
4

2 回答 2

2

使用 Node.js' http.Server,您可以自己建立任何路由。

而且,你已经接近这个了。不过,您需要根据解析的 URLpathname而不是query.

var pathname = url.parse(request.url, true).pathname;

switch (true) {
    case /\/friend/.test(pathname):
        case1(request, response);
        break;

    case /\/foes/.test(pathname):
        case1(request, response);
        break;
}

您可能还希望包括测试request.method.

case request.method === 'GET' && /\/friend/.test(pathname):

或者,正如soulcheck 所提到的,有许多可用的库/框架具有已建立的路由 API,包括expressrestify

var app = express();

app.get('/friend', case1);
app.get('/foes', case2);
于 2013-09-04T10:16:32.513 回答
1

这是另一种解决方案:您可以使用函数组合将多个处理程序组合成一个处理程序。req.url如果不匹配,每个处理程序都应该将执行交给下一个处理程序。wrapHandler也可以进一步扩展以考虑 HTTP 方法。

var http = require('http');

var handler1 = function(req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.write('/');
    res.end();  
}

var handler2 = function(req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.write('/Hello');
    res.end();  
}

var middleware = compose([wrapHandler('/', handler1),
                         wrapHandler('/hello', handler2)]);

http.createServer(middleware).listen(3000);

function wrapHandler(path, cb) {
    return function (req, res, next) {
        if (req.url === path) {
            cb(req, res);
        } else {
            next();
        }
    };
}

function notFoundHandler(req, res) {
    res.writeHead(404, { 'Content-Type': 'text/html' });
    res.write('No Path found');
    res.end();    
};

// adapted from koa-compose
function compose(middleware) {
    return function (req, res){
        let next = function () {
            notFoundHandler.call(this, req, res);
        };

        let i = middleware.length;
        while (i--) {
            let thisMiddleware = middleware[i];
            let nextMiddleware = next;
            next = function () { 
                thisMiddleware.call(this, req, res, nextMiddleware);
            }
        }
        return next();
    }
}
于 2016-07-07T08:28:54.673 回答