2013-09-04 1 views
1

저는 토네이도에서 requestHandler 클래스를 가지고 있으며, 쿼리 결과와 일치하는 requestHandler를 찾습니다.node.js에서 여러 요청 처리기를 어떻게 사용합니까?

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) 
+0

는 해당위한 프레임 워크를 사용, 즉 [espress] (http://expressjs.com/) 또는 [restify] (http://restify.io/) – soulcheck

+0

있습니까'friend'와'foes' URL 경로가 되려고합니까? 또는 쿼리 문자열 매개 변수로 이들의 존재를 테스트하고 싶습니까? –

+0

예, URL 경로입니다. Soulcheck, http://stackoverflow.com/questions/5683916/node-js-express-vs-geddy/5683938#5683938에서 Raynos는 "프레임 워크? 실재 남성은 노드를 직접 사용합니다"라고 말했습니다. 나는 장고가 싫어서 거기에 가고 싶지 않아. – JulienFr

답변

2

Node.js 'http.Server을 사용하면 라우팅 설정에 도움이됩니다.

그리고 이것에 가깝습니다. 하지만 구문 분석 된 URL이 query이 아닌 pathname을 기반으로 테스트하려고 할 것입니다.

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로, expressrestify 포함 라우팅 설립 API를 가지고 numerous libraries/framework available있다.

var app = express(); 

app.get('/friend', case1); 
app.get('/foes', case2); 
+0

Thx 많이 있습니다. 두 가지 해결책의 찬반 양론? 속도 ... – JulienFr

+0

@JulienFr "* 바닐라 *"와 도서관 또는 Express와 Restify 사이에서 사용 하시겠습니까? 1) 노드의 API는 여러 가지면에서 다소 낮은 수준이므로 "* 바닐라 *"는 개발을 위해 추가 개발 시간이 필요합니다. 'http.Server's에 대해서, 당신이 좋아하는 라우터를 찾는 것이 좋습니다. 2) [Restify의 문서] (http://mcavage.me/node-restify/)에는 실제로 Express에 대한 차이점에 대한 요약이 포함되어 있습니다. "* Express '유스 케이스는 브라우저 응용 프로그램을 대상으로하며 많은 기능을 포함합니다 복원을하지 않아도됩니다. * " –

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(); 
    } 
} 
관련 문제