ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Express - Middleware
    Express.js 2021. 9. 20. 02:47
    const express = require('express');
    
    const app = express();

    Express 모듈을 실행해 app 변수에 할당한다.
    익스프레스 내부에 http 모듈이 내장되어 있으므로 서버의 역할을 할 수 있다.

     

    app.set('port',process.env.PORT || 3000)

    서버가 실행될 포트를 설정한다.
    process.env 객체에 PORT 속성이 존재하면 그 값을 사용하고 없다면 3000을 Port로 사용한다.

    app.set( 키 , 값 ) 을 사용해서 데이터를 저장할 수 있다.
    나중에 데이터를 app.get(키) 로 가져 올 수 있다.

     

    app.get('/',(req,res) => {
        res.send('Hello, Express');
    }

    app.get(주소 , 라우터 ) 는 주소에 대한 GET 요청이 올 때 어떤 동작을 할지 적는 부분이다.
    express에서는 res.write나 res.end 대신에 res.send를 사용한다.


    응답을 문자열 대신에 HTML로 응답하고 싶다면 res.sendFile 를 사용하면 된다. 파일의 경로를 path 모듈을 사용해서 지정해야 한다.

    const express = require('express');
    const path = require('path');
    
    const app = express();
    app.set('port',process.env.PORT || 3000);
    
    app.get('/',(req,res) => {
        res.sendFile(path.join(__dirname, '/index.html'));
    });
    
    app.listen(app.get('port'),() => {
        console.log(app.get('port'), '번 포트에서 대기 중');
    });

    미들웨어는 요청과 응답의 중간에 위치하여 미들웨어라고 부른다.
    라우터와 에러 핸들러 또한 미들웨어의 일종이다.
    미들웨어는 app.use와 함께 사용된다.
    app.use(미들웨어) 꼴이다.

    ...
    app.set('port',process.env.PORT || 3000);
    
    app.use((req,res,next) => {
        console.log('모든 요청에 다 실행된다.');
        next();
    });
    
    app.get('/',(req,res,next) => {
        console.log('GET / 요청에만 실행된다.')
        next();
    }, (req,res) => {
        throw new Error('에러는 에러처리 미들웨어로 이동한다');
    });
    
    app.use((err,req,res,next) => {
        console.error(err);
        res.status(500).send(err.message);
    });
    
    ...

    app.use 에 매개변수가 req,res,send 인 함수를 넣는다.
    미들웨어는 위에서 아래로 실행
    요청과 응답 사이에 특별한 기능을 추가할 수 있다.

    next는 다음 미들웨어로 넘어가는 함수이다.
    next를 실행하지 않으면 다음 미들웨어가 실행되지 않는다.

    주소를 첫번째 인자에 넣어주지 않으면 미들웨어는 모든 요청에서 실행된다.

    app.use(미들웨어) 모든 요청에서 미들웨어 실행
    app.use('/abc',미들웨어) abc로 시작하는 요청에서 미들웨어 실행
    app.post('/abc',미들웨어) abc로 시작하는 POST 요청에서 미들웨어 실행

    미들웨어를 여러 개 장착할 수 있다.
    next를 호출해야 미들웨어가 넘어간다.

     

    에러 처리 미들웨어는 매개변수가 반드시 4개여야 한다.
    첫 번째 매개변수 err에는 에러에 관한 정보가 담겨 있다.
    res.status 메서드로 HTTP 상태 코드를 지정할 수 있다.
    특별한 경우가 아니라면 가장 아래에 위치하도록 한다.


    npm i morgan cookie-parser express-session dotenv

    dotenv는 process.env를 관리하기 위한 패키지 이다.

    미들웨어 내부에 req,res,next가 존재하며 next는 내부적으로 호출한다.

     

    [ morgan ]

    ...
    const morgan = require('morgan');
    ...
    app.use(morgan('dev'));
    ...

    인수로 dev 외에 combined, common , short , tiny 등을 넣을 수 있다.
    개발환경에서는 dev를 배포 환경에서는 combined를 애용하자.

    dev 모드 기준 GET / 500 7.409 ms - 50 은 [ HTTP 메서드 ] [ 주소 ] [ HTTP 상태 코드 ] [ 응답 속도 ] - [ 응답 바이트 ] 를 의미한다.

     

    [ static ]

    app.use('/',express.static(path.join(__dirname, 'public')));

    static 미들웨어는 정적인 파일들을 제공하는 라우터 역할을 한다.
    express 객체 안에서 꺼내 사용하면 된다.

    'public/stylesheets/style.css 는 http://localhost:3000/stylesheets/style.css 로 접근할 수 있다.

    서버의 폴더 경로와 요청 경로가 다르므로 외부인이 서버의 구조를 쉽게 파악할 수 없다.

     

    [ body-parser ]

     

    본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어이다.
    보통 form데이터나 AJAX 요청의 데이터를 처리한다.
    단, 멀티파트(이미지,동영상,파일) 데이터는 처리하지 못한다.

     

    app.use(express.json());
    app.use(express.urlencoded({ extended : false }));

     

    body-parser는 express에 내장 되어 있다.

    body-parser는 JSON과 URL-encoded 형식의 데이터 외에도 Raw, Text 형식의 데이터를 추가로 해석할 수 있다.
    Raw와 Text를 해석하는 경우 body-parser를 설치해야 한다.

     

    npm i body-parser
    const bodyParser = require('body-parser');
    app.use(bodyParser.raw());
    app.use(bodyParser.text());

     

    JSON은 JSON 형식의 데이터 전달 방식
    URL-encoded는 주소 형식으로 데이터를 보내는 방식 => form 전송은 URL-encoded 방식을 주로 사용한다.
    urlencoded 메서드를 보면 { extended : false } 라는 옵션이 들어있다.
    false면 querystring 모듈을 사용하여 쿼리스트링을 해석
    true면 qs 모듈을 사용하여 쿼리스트링을 해석한다.

     

    [ cookie-parser ]

    cookie-parser는 요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만든다.

    ...
    const cookieParser = require('cookie-parser');
    ...
    app.use(cookieParser(process.env.COOKIE_PARSER));


    해석된 쿠키들은 req.cookies 객체에 들어간다.
    name = jin-Pro 쿠키를 보냈다면
    req.cookie 는 { name : 'jin-Pro' } 가 된다.
    유효 기간이 지난 쿠키들은 알아서 걸러진다.

    첫 번째 인수로 비밀 키를 넣어줄 수 있다.
    비밀 키를 통해서 해당 쿠키가 내 서버에서 만든 쿠키임을 검증할 수 있다.

    쿠키를 생성/제거 하기 위해서는 res.cookie, res.clearCookie 메서드를 사용해야 한다.
    쿠키를 지우려면 expries나 maxAge 옵션을 제외한 모든 옵션을 정확히 일치해야 지워진다.

     

    [ express-session ]

    const session = require('express-session');
    
    app.use(session({
        resave : false,
        saveUninitialized : false,
        secfret : process.env.COOKIE_SECRET,
        cookie : {
            httpOnly : true,
            secure : false,
        },
        name : 'session-cookie',
    }));

    세션 관리용 미들웨어 이다.
    로그인 , 특정 사용자를 위한 데이터를 임시적으로 저장할 때 유용하다.

    • resave : 요청이 올 때 세션에 수정 사항이 생기지 않더라도 세션을 다시 저장할지 설정
    • saveUninitialize : 세션에 저장할 내역이 없더라도 처음부터 세션을 생성할지 설정
    • secret : 세션 쿠키를 전송하기 위해 쿠키를 서명하는데 필요하다.
    • cookie : cookie에 대한 설정이다.
    • store : 메모리에 세션을 저장하도록 되어 있다. 서버를 재시작하면 메모리가 초기화되어 세션이 모두 사라지기 때문에 데이터베이스를 연결해야 한다.

     

    req.session.name = 'jin-Pro';
    req.sessionID;
    req.session.destory();

    req.session에 값을 대입하거나 삭제해서 세션을 변경시킬 수 있다.

    세션을 한 번에 삭제하려면 req.session.destory 메서드를 사용한다.
    세션을 강제로 저장하기 위해 req.session.save 메서드를 사용하지만, 일반적으로 요청이 끝날 때 자동으로 호출된다.

     

    [ multer ]

    이미지 , 동영상 을 비롯한 멀티파트 형식으로 업로드 할 떄 사용하는 미들웨어 이다.

    $ npm i multer

     

    multer 함수의 인수로 설정을 넣는다.

    • storage
      destination ( 어디에 )
      filename ( 이름 )
      위 두 함수의 req 매개변수에는 요청에 대한 정보가 file 객체에는 업로드한 파일에 대한 정보가 있다.

      done 매개변수에는 에러가 있다면 첫 번째 인수에 에러를 넣고, 두 번째 인수에는 실제 경로나 파일 이름을 넣는다.

     

    • limits
      업로드에 대한 제한 사항을 설정할 수 있다.

     

    [ 미들 웨어의 특성 ]

     

    • 특정 주소의 요청에만 미들웨어가 실행되게 하려면 첫 번째 인수로 주소를 넣는다.
    • 동시에 여러 개의 미들웨어를 장착할 수 있다.
    • 다음 미들웨어로 넘어가려면 next함수를 호출한다.
    • next를 호출하지 않는 미들웨어는 res.send나 res.sendFile 등의 메서드로 응답을 보낸다.
    • express.static과 같은 정적파일을 제공할 때 next 대신 res.sendFile 메서드로 응답을 보낸다.
      따라서, express.json , express.urlencoded , cookieParser 미들웨어는 실행되지 않는다.
    • next 함수에 인수를 넣을 수도 있다.
      route라는 문자열을 넣으면 다음 라우터의 미들웨어로 바로 이동한다.
      그 외 다른 문자열을 넣으면 에러 처리 미들웨어로 이동한다.
    • 미들웨어 간 데이터를 전달하는 방법도 있다.
      req.session 객체에 데이터를 넣어도 되지만, 세션이 유지되는 동안에 데이터도 계속 유지 된다.
      req 객체에 데이터를 넣어두면 요청이 끝날 때 까지만 데이터를 유지한다.
      req.data를 통해 미들웨어 간 데이터를 공유 할 수 있다.

    'Express.js' 카테고리의 다른 글

    Express - Router 라우팅 , req , res  (0) 2021.09.25
    JWT  (0) 2021.09.24

    댓글

Designed by Tistory.