유저 혹은 컴퓨터에 있어서 달라져야하는 가변적인 변수들을 환경변수라고 부른다.
환경변수들은 서버파일에 하드코딩을 해놓는 것 보다 따로 별도의 파일에 보관하는 것이 좋다.
보통 .env 파일에 환경변수들을 보관하는데 사용해보자
npm install dotenv
터미널에서 dotenv를 설치해준다.
서버 파일 상단에
require('dotenv').config()
를 추가해주면 .env 파일을 사용할 수 있다.
server.js 와 같은 선상에 .env파일을 하나 만들어두었다.
변수를 보관하려면
변수명 = 변수에 저장할 값
이렇게 작성해두면 된다.
에를 들어
.env
PORT = 8080
이렇게 저장해두고
해당 변수를 사용하고 싶으면,
server.js
process.env.PORT
소스코드에 process.env.PORT 이렇게 작성하면 그 자리에 8080 값이 남아있게 된다.
예를 들어 수많은 API 안에 로그인을 검사하는 코드가 있어야 한다고 가정을 했을 때,
if(req.user){
로그인 검사~
}
API 마다 해당 코드를 작성해야 한다.
그럼 함수를 만들어서 쓰면 되지않나?
function checkLogin(req){
if(req.user){
로그인 검사~
}
}
이렇게 작성해서 두면 해당 함수를 실행만 해주면 된다.
하지만 다른 방법도 존재한다.
function checkLogin(req){
if(req.user){
로그인 검사~
}
}
app.get('/list', checkLogin, (req, resp) =>{
~~~~
})
이렇게 app.get 요청 안에 함수를 끼워넣어 요청과 응답 사이에 실행되는 것을 미들웨어라고 한다.
그러나 함수 API 코드 안에 미들웨어 형태로 집어넣어서 사용하려면 미들웨어로 사용할 함수에 최소 3개의 파라미터가 존재해야한다.
각각 요청, 응답, next가 있으면 된다.
그렇게 되면
요청.body, 요청.query, 요청.user
응답.redirect, 응답.send, 응답.render
를 사용할 수 있고,
next 파라미터는 미들웨어를 실행하고 끝나면 다음으로 진행 여부를 결정할 수 있는데
next()를 통해서 다음 코드를 실행시켜줄 수 있다.
next()를 안써주면 무한 대기 상태에 빠질 수 있다.
API가 수없이 많이 존재할 때, 하나하나 미들웨어로 끼워넣기가 귀찮을 수 있다.
그럴 떈
app.use(checkLogin)
app.get('/list', (req, resp) =>{
~~~~
})
해당 app.use 코드 아래 모든 API에는 전부 미들웨어로 checkLogin을 사용해주게 된다.
좀 더 편리하다.
또 한가지로 app.use에 파라미터에 URL을 적게되면
app.use('/list', checkLogin)
app.get('/list', (req, resp) =>{
~~~~
})
/list로 시작하는 URL 모두 checkLogin을 미들웨어로 등록하고 실행해주게 된다.