你如何在node.js中使用多个请求处理程序?

我来自龙卷风,你有一个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) 

使用Node.js的http.Server ,您可以自行build立任何路由。

而且,你已经接近这个了。 但是,您需要基于parsing的URL的pathname而不是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; } 

您可能还需要包含testingrequest.method

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

或者,如soulcheck所提到的,有许多库/框架可用 ,具有用于路由的已build立的API,包括express和restify 。

 var app = express(); app.get('/friend', case1); app.get('/foes', case2); 

这是一个可选的解决scheme:您可以使用函数组合将多个处理程序组合到一个处理程序中。 如果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(); } }