ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Express의 미들웨어들
    Legacy/Node.js 2017. 1. 14. 01:49
    728x90

    참고 - [3판] 모던 웹을 위한 Node.js 프로그래밍 (윤인성)


    Express의 미들웨어들 - http://expressjs.com/en/resources/middleware.html


    1. router 미들웨어


    Express에 내장되어 있는 미들웨어로 별로 미들웨어라는 느낌을 받지 않고 사용할 수 있음.

    추가적인 모듈 설치 및 require 없이 app.get(), app.post() 등과 같은 메소드 호출만 필요함.


    // 모듈을 추출합니다.
    var express = require('express');
    
    // 서버를 생성합니다.
    var app = express();
    
    // 라우터를 설정합니다.
    app.get('/a', function (request, response) {
      response.send('<a href="/b">Go to B</a>');
    });
    app.get('/b', function (request, response) {
      response.send('<a href="/a">Go to A</a>');
    });
    
    // 서버를 실행합니다.
    app.listen(52273, function () {
      console.log('Server running at http://127.0.0.1:52273');
    });
    

    위와 같이 고정된 url에 대해 처리해주면 되지만, RESTful API를 요청할 경우 글 번호 같은것을 url로 전송하면 받아오고 싶은경우가 있다. 스프링 프레임워크에 익숙한 사람이라면 @PathVariable을 생각하면 되겠다.

    // 모듈을 추출합니다.
    var express = require('express');
    
    // 서버를 생성합니다.
    var app = express();
    
    // 라우터를 설정합니다.
    app.get('/page/:id', function (request, response) {
      // 변수를 선언합니다.
      var name = request.params.id;
    
      // 응답합니다.
      response.send('<h1>' + name + ' Page</h1>');
    });
    
    // 서버를 실행합니다.
    app.listen(52273, function () {
      console.log('Server running at http://127.0.0.1:52273');
    });

    URL 매핑 부분에 ":변수명"을 입력한 후 "request.params.변수명"으로 받아오면 된다.
    다만 동적으로 데이터를 받아오게 되기 때문에 입력값에 대한 검증 및 보안 코딩이 필요하다.

    추가로 모든 라우팅 페이지에 대한 전체선택자를 사용할 수 있다. 경로를 "*"로 설정해주면 된다.

    // 모듈을 추출합니다.
    var express = require('express');
    
    // 서버를 생성합니다.
    var app = express();
    
    // 라우터를 설정합니다.
    app.get('/index', function (request, response) {
      response.send('<h1>Index Page</h1>');
    });
    app.all('*', function (request, response) {
      response.status(404).send('<h1>ERROR - Page Not Found</h1>');
    });
    
    // 서버를 실행합니다.
    app.listen(52273, function () {
      console.log('Server running at http://127.0.0.1:52273');
    });
    



    router는 모듈화할 수 있다. 다음 두 코드를 보고 동작 방식을 이해해보자.

    1) /a/index, /b/index의 생성

    // 모듈을 추출합니다.
    var express = require('express');
    
    // 서버를 생성합니다.
    var app = express();
    
    // 라우터를 설정합니다.
    var routerA = express.Router();
    var routerB = express.Router();
    
    // 라우터A를 설정합니다.
    routerA.get('/index', function (request, response) {
      response.send('<h1>Index Page</h1>');
    });
    
    // 라우터B를 설정합니다.
    routerB.get('/index', function (request, response) {
      response.send('<h1>Index Page</h1>');
    });
    
    // 라우터를 설정합니다.
    app.use('/a', routerA);
    app.use('/b', routerB);
    
    // 서버를 실행합니다.
    app.listen(52273, function () {
      console.log('Server running at http://127.0.0.1:52273');
    });



    2) /a/index, /b/index의 생성 (+ 경로 별로 파일 나눠주기)

    // routerA.js 파일
    // 모듈과 변수 선언
    var express = require('express');
    var router = express.Router();
    
    // 페이지 라우트
    router.get('/index', function (request, response) {
      response.send('<h1>Index Page</h1>');
    });
    
    // 외부로 뺍니다.
    exports.router = router


    // index.js 파일 // 모듈을 추출합니다. var express = require('express'); // 서버를 생성합니다. var app = express(); app.use('/a', require("./routerA.js").router); app.use('/b', require("./routerB.js").router); // 서버를 실행합니다. app.listen(52273, function () { console.log('Server running at http://127.0.0.1:52273'); });


    routerB.js도 routerA.js와 마찬가지로 추가로 만들어줘야합니다.


    2. static 미들웨어

    static 미들웨어 역시 router 미들웨어와 마찬가지로 express에 내장된 미들웨어임. 

    대개는 ./public 폴더에 정적 파일들을 저장하고 static 미들웨어를 이용해 정적파일을 매핑해준다.


    ./public 폴더를 하나 만들어주고 그곳에 아무 파일이나 하나 만들어주고 해당 파일에 접근해보자.


    // 모듈을 추출합니다.
    var express = require('express');
    
    // 서버를 생성합니다.
    var app = express();
    
    // 미들웨어를 설정합니다.
    app.use(express.static(__dirname + '/public'));
    
    // 서버를 실행합니다.
    app.listen(52273, function () {
      console.log('Server running at http://127.0.0.1:52273');
      console.log(__dirname);
    });


    파일이름이 abc.txt라면

    브라우저에 "localhost:52273/abc.txt"라고 입력하면된다.

    위와 같은 방식으로 RESTful API 서버를 쉽게 만들 수 있다. static요청에 대해서 index.html로 가도록 하면된다.


    3. 그 외 다른 모듈들

    http://expressjs.com/en/resources/middleware.html을 참조

Designed by Tistory.