你如何在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(); } }