코드코코

210916 [6장] 6.2 자주 사용하는 미들웨어 본문

기록/node.js 교과서 따라하기

210916 [6장] 6.2 자주 사용하는 미들웨어

코드코코 2021. 9. 16. 21:18

1. app_ver3.js : 미들웨어 사용

const express = require('express');
const app = express();

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

//next : 다음 미들웨어로 넘어가는 매개변수
app.use((req, res, next) => {
    console.log('모든 요청에 다 실행됩니다.');
    next();
});

app.get('/', (req, res, next) => {
    console.log('GET / 요청에서만 실행됩니다.');
    next();
}, (req, res) => {
    throw new Error('에러는 에러처리 미들웨어로 갑니다.')
});

//에러처리미들웨어 모든 변수를 사용하지 않더라도 매개변수 4개여야함.
//첫번째 매개변수 err : 에러에 관한 정보가 담겨있음.
app.use((err, req, res, next) => {
    console.error(err);
    //HTTP 상태코드 지정.
    res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기 중');
});

2. app_ver4.js : morgan, static, body-parser, cookie-parser, erxpress-session

const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

//dotenv패키지는 .env파일을 읽어서 process.env로 만듦.
dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);


//요청과 응답에 대한 정보를 콘솔에 기록
//'dev'대신 combined,common,short,tiny 등 사용.
//'dev'모드 기준으로 GET / 500 10.732 ms - 35 는 [HTTP메서드][주소][HTTP상태코드][응답속도]-[응답바이트]의미
app.use(morgan('dev'));


//static : 정적인 파일들을 제공하는 라우터 역할
//기본적으로 express에 내장되어있음
//app.use('요청경로',express.static('실제경로'));
//서버의 폴더 경로와 요청경로가 다르므로 보안에 도움됨.
//만약 요청경로에 해당하는 파일이 없으면 알아서 내부적으로 next 호출
app.use('/', express.static(path.join(__dirname, 'public')));


//body-parser : 요청의 본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어.
//보통 폼데이터나 AJAX요청의 데이터를 처리. 단, 멀티파트(이미지,동영상,파일)데이터는 처리 못함.
//express에 내장됨. 단, raw(요청의 본문이 버퍼데이터일때)나 text 형식의 요청이 들어오는 경우 설치필요


//json형식의 데이터 전달방식
//{ name: 'coco', book: 'nodejs' }
app.use(express.json());
//주소형식으로 데이터 전달, 폼전송에서 많이 사용.
//옵션(extended)이 false인 경우 querystring 모듈 ,true인경우 qs모듈 사용하여 쿼리스트링 해석.
//name=minjoo&book=nodejs
app.use(express.urlencoded({ extended: false }));

//추가설치시 해당내용 추가
const bodyparser = require('body-parser');
app.use(bodyparser.raw());
app.use(bodyparser.text());


//cookie-parser : 요청에 동봉된 쿠키를 해석해 req.cookies객체로 만듦.
//서명된 쿠키는 req.signedcookies객체에 들어감.
//app.use(cookieParser(비밀키));

app.use(cookieParser(process.env.COOKIE_SECRET));

// //쿠키생성
// res.cookie('name', 'coco', { exprires: new Date(Date.now() + 900000), httpOnly: true, secure: true, });
// //쿠키제거
// res.clearCookie('name', 'coco', { httpOnly: true, secure: true, });


//express-session : 세션 관리용 미들웨어
//인수로 세션에대한 설정을 받음.
//세션은 사용자별로 req.session 객체 안에 유지
app.use(session({
    //요청이 올 때 세션에 수정 사항이 생기지 않더라도 세션을 다시 저장할지
    resave: false,
    //세션에 저장할 내역이 없더라도 처음부터 세션을 생성할지
    saveUninitialized: false,
    //세션쿠키
    //쿠키에 서명추가
    secret: process.env.COOKIE_SECRET,
    cookie: {
        //클라이언트에서 쿠키를 확인하지 못하도록 함.
        httpOnly: true,
        //https가 아닌 환경에서도 사용할 수 있는지.
        secure: false,
    },
    //세션쿠키의 이름 : 기본 이름은 connect.sid
    name: 'session-cookie',
}));

// //세션등록
// req.session.name='coco';
// //세션아이디확인
// req.sessionID;
// //세션 모두 제거
// req.session.destory();
// express-session에서 서명한 쿠키 앞에는 s:붙음.
// 실제로는 encodeURIComponent 함수가 실행되어 s%3A가 됨.
// 따라서 s%3A가 붙은 경우 express-session 미들웨어에 의해 암호와 된 것으로 생각하면 됨.


app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기 중');
});


//app.set('port',포트) : 서버가 실행될 포트 설정.
//app.set(키,값) : 데이터 저장.
//app.get(키) : 데이터 가져오기
//app.get(주소,라우터) : 주소에 대한 get요청이 들어 올 때, 어떤 동작을 할지 적는 부분.

//app.get, app.post, app.put, app.patch , app.delete, app.options 메서드 존재. 

//process.env를 별도의 파일로 관리하는 이유는 보안과 설정의 편의성 때문이다.