-
Express - MiddlewareExpress.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