//app.js
const express = require('express');
const path = require('path');
const app = express();
app.set('port',process.env.PORT || 3000);
app.use((req,res,next)=>{ //모든 요청에서 미들웨어 실행
console.log('모든 요청에서 다 실행됩니다');
next(); //다음 미들웨어로
});
app.get('/',(req,res,next)=>{ //GET요청을 처리하는 라우트
console.log('GET/요청에서만 실행됩니다'); //GET요청에서 실행
next();
},(req,res)=>{ //강제 에러 발생
throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
});
app.use((err,req,res,next)=>{ //에러처리를 위한 미들웨어
console.error(err);
res.status(500).send(err.message);
});
// 서버 시작
app.listen(app.get('port'), () => {
console.log(app.get('port'),'번 포트에서 대기 중');
});
- 미들웨어는 위에서 아래로 순서대로 진행되면서 요청과 응답 사이에 특별한 기능을 추가할 수 있다. - app.use() 를 통해 미들웨어를 등록할 수 있다. [출처] https://velog.io/@seosu2000/Middleware%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
- 위의 코드와 같이 app.use나 app.get 라우터에 여러개의 미들웨어를 장착할 수 있다.
콘솔 및 화면 출력
위의 코드는 직접 미들웨어를 작성해준 것이며 패키지를 설치할 수 있다
미들 웨어 패키지 설치
npm i morgan cookie-parser express-session dotenv
(dotenv는 미들웨어가 아닌 process.env를 관리하기 위해 설치한 것)
[패키지를 설펴보기 위한 테스트 코드]
먼저 .env 파일을 생성해줍니다.
- . env 파일은 환경 변수를 저장해두는 파일입니다.
- 데이터베이스 비밀번호, API 키, 포트 번호 등과 같은 민감한 정보를 코드에 직접 작성하지 않고 .env 파일에 저장할 수 있습니다.
//.env
COOKIE_SECRETE = cookiesecret
//app.js
const cookieParser = require('cookie-parser'); //설치했던 패키지들을 불러오기
const express = require('express');
const morgan =require('morgan');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config(); //dotenv 패키지는 .env 파일을 읽어 process.env를 만든다.
const app = express();
app.set('port',process.env.PORT || 3000);
app.use(morgan('dev')); //app.use에 연결
app.use('/',express.static(path.join(__dirname,'public')));
app.use(express.json());
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave : false,
saveUninitialized : false,
secret: process.env.COOKIE_SECRET,
cookie:{
httpOnly:true,
secure : false,
},
name :'session-cookie',
}));
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.listen(app.get('port'), () => {
console.log(app.get('port'),'번 포트에서 대기 중');
});
자주 사용하는 미들웨어 간단 설명 : 나중에 필요한 부분은 더 자세하게 다룰 것
1. morgan
- 위의 코드를 실행시켰을 때 아까와는 콘솔에서 추가적인 로그를 확인할 수 있다.
- 이는 morgan 미들웨어에서 나오는 것으로 요청과 응답에 대한 정보를 콘솔에 기록해준다.
- 현재 코드에서는 app.use('dev')로 사용중이지만, 'combined', 'common', 'short', 'tiny' 등을 넣을 수 있다.
- 'combined' : 배포환경에서 주로 사용되며 , 접속 IP를 로그에 남겨준다 - 'common' : - - [29/Sep/2024:06:18:48 +0000] "GET / HTTP/1.1" 500 50 (사용자 인증 정보, 요청시간, 요청 메소드, http상태코드, 응답바이트 수 등) - 'short' : 기본 설정보다 짧은 로그를 출력하고, 응답 시간을 포함한다. : - GET / HTTP/1.1 500 50 - 3.080 ms - 'tiny' : 더 최소화 : GET / 500 50 - 7.080 ms
- express 4.16.0 버전 부터는 익스프레스에 내장되어있어 따로 설치할 필요가 없으나 필요한 경우 설치를 해주도록 하자.
npm i body-parser
- body-parser는 JSON과 URL-encoded형식의 데이터 외에도 Raw, Text형식의 데이터를 추가로 해석할 수 있다.
app.use(express.json());
- 예시코드에서는 이렇게 사용되었다
- 클라이언트가 JSON 형식으로 데이터를 보낼 때, 이를 JavaScript 객체로 변환합니다
ex. {name : 'sua', book : node.js}와 같은 JSON형식을 본문으로 보낸다면 req.body에 그대로 들어간다.
4. cookie-parser
- 요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만든다.
사용 방법 : app.use(cookieParser(비밀키));
app.use(cookieParser(process.env.COOKIE_SECRET));
5. express-session
- 세션 관리용 미들웨어
- 로그인 등의 이유로 세션을 구현하거나, 특정 사용자를 위한 데이터를 임시적으로 저장해둘 때 유용하다.
- 세션은 사용자 별로 req.session 객체 안에 유지 된다.
app.use(session({
resave :false,
saveUninitialized :false,
secret:process.env.COOKIE_SECRET,
cookie:{
httpOnly:true,
secure :false,
},
name :'session-cookie',
}));
-(참고) cookie-parser 뒤에 두는 것이 좋다
resave : 요청이 올떄 세션에 수정 사항이 생기지 않더라도 다시 저장을 할지 saveUninitialized : 세션에 저장할 내역이 없더라도 처음부터 세션을 생성할지 secrete의 값은 cookie-parser의 secrete과 동일하게 하는게 좋다 cookie : 쿠키 옵션에 대한 설정 - httpOnly : true -> 클라이언트는 쿠키를 확인하지 못하도록 - secure : false -> https 환경이 아니더라도 사용할 수 있도록, 배포시에는 true 로 설정하는 것이 좋다. name : 세션 쿠키의 이름 ( 기본이름은 connect.sid) + store : 배포시에는 데이터베이스를 연결하여 세션을 유지하는 것이 좋다.