Node.js 라우팅


요청된 URL과 기타 필수 GET 및 POST 매개변수를 경로에 제공해야 하며, 그런 다음 경로는 이러한 데이터를 기반으로 해당 코드를 실행해야 합니다.

그러므로 HTTP 요청을 살펴보고 요청된 URL과 GET/POST 매개변수를 추출해야 합니다. 이 기능이 라우팅에 속하는지 서버에 속하는지(또는 모듈 자체의 기능으로) 실제로 논의할 가치가 있지만 여기서는 임시적으로 HTTP 서버의 기능으로 간주됩니다.

우리에게 필요한 모든 데이터는 onRequest() 콜백 함수의 첫 번째 매개변수로 전달되는 요청 객체에 포함됩니다. 하지만 이 데이터를 구문 분석하려면 url 및 querystring 모듈인 추가 Node.JS 모듈이 필요합니다.

                   url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring(string)["foo"]    |
                                            |
                         querystring(string)["hello"]

물론 쿼리스트링 모듈을 사용하여 POST 요청 본문의 매개변수를 구문 분석할 수도 있습니다. 이에 대해서는 나중에 설명하겠습니다.

이제 브라우저에서 요청한 URL 경로를 찾기 위해 onRequest() 함수에 몇 가지 로직을 추가해 보겠습니다.

var http = require("http");
var url = require("url");

function start() {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

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

exports.start = start;

자, 이제 애플리케이션에서 요청한 URL 경로로 다양한 요청을 구분할 수 있습니다. 이를 통해 라우팅( 아직 완료되지 않음) URL 경로를 기반으로 요청을 핸들러에 매핑합니다.

우리가 구축 중인 애플리케이션에서 이는 /start 및 /upload의 요청이 다른 코드를 사용하여 처리될 수 있음을 의미합니다. 나중에 이것이 어떻게 결합되는지 살펴보겠습니다.

이제 router.js라는 파일을 만들고 다음 콘텐츠를 추가할 수 있습니다.

function route(pathname) {
  console.log("About to route a request for " + pathname);
}

exports.route = route;

보시다시피 이 코드는 아무 작업도 수행하지 않지만 지금은 이것이 되어야 합니다. 로직을 추가하기 전에 먼저 라우팅과 서버를 통합하는 방법을 살펴보겠습니다.

우리 서버는 경로의 존재를 인식하고 이를 효과적으로 사용해야 합니다. 물론 이 종속성을 서버에 하드 코딩할 수 있지만 다른 언어로 프로그래밍한 경험에 따르면 이것이 어려울 것이므로 종속성 주입을 사용하여 경로 모듈을 느슨하게 추가할 것입니다.

먼저 라우팅 함수를 매개변수로 전달할 수 있도록 서버의 start() 함수를 확장해 보겠습니다. server.js 파일 코드는 다음과 같습니다

var http = require("http");
var url = require("url");

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

    route(pathname);

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

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

exports.start = start;

동시에 그에 따라 index.js도 확장하겠습니다. 라우팅 기능이 서버에 주입될 수 있도록:

var server = require("./server");
var router = require("./router");

server.start(router.route);

여기에서 우리가 전달한 기능은 여전히 ​​아무 작업도 수행하지 않습니다.

지금 애플리케이션을 시작한 다음(node ​​​​index.js, 항상 이 명령줄을 기억하세요) URL을 요청하면 애플리케이션이 해당 정보를 출력하는 것을 볼 수 있습니다. 이는 HTTP 서버가 이미 라우팅 모듈을 사용하고 있음을 나타냅니다. 요청된 경로를 라우터에 전달합니다:

$ node index.js
Server has started.

위 출력에서는 성가신 /favicon.ico 요청 관련 부분이 제거되었습니다.

브라우저 액세스 http://127.0.0.1:8888/, 출력 결과는 다음과 같습니다.

251.jpg