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

dotenv.config();

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

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: true
  },
  name: 'session-cookie'
}))

app.use( (req, res, next) => {
  console.log('모든 요청에 다 실행된다.');
  next();
});

app.get('/', (req, res, next) => {
  // res.send('hello, Express');
  /**
   * type module로 앱을 실행하면 __dirname is not defined가 뜨는데 이유 찾아보기.
   */
  res.sendFile(path.join(__dirname, 'views', 'index.html'));
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트로 express 실행 중');
});

app.set(key, value) 를 사용해 데이터를 저장할 수도 있음.

req : 요청에 관한 정보가 들어 있는 객체 res : 응답에 관한 정보가 들어 있는 객체

<aside> 💡

express에서는 res.write나 res.end 대신 res.send를 사용한다.

</aside>

미들웨어


미들웨어는 익스프레스의 핵심이다. 요청과 응답의 중간(미들(middle))에 위치하여 미들웨어라고 부른다. 미들웨어는 익스프레스의 전부라고 해도 과언이 아니다. 요청과 응답을 조작하여 기능을 추가하기도 하고, 나쁜 요청을 걸러내기도 한다. 미들웨어는 app.use(미들웨어) 와 함께 사용된다.

app.use( (req, res, next) => {
  console.log('모든 요청에 다 실행된다.');
  next();
});

미들웨어는 위에서부터 아래로 순서대로 실행되면서 요청과 응답 사이에 특별한 기능을 추가할 수 있다. next() 라는 세 번째 매개변수를 사용할 수 있고, 다음 미들웨어로 넘어가는 함수이다. 사용하지 않으면 다음 미들웨어가 실행되지 않는다.

주소를 첫 번째 인수로 넣어주지 않는다면 미들웨어는 모든 요청에서 실행되고, 주소를 넣는다면 해당하는 요청에서만 실행된다고 보면 된다.

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

app.useapp.get 같은 라우터에 미들웨어를 여러 개 장착할 수 있다.

에러 처리 미들웨어는 매개변수가 err, req, res, next로 네 개이다. 모든 매개변수를 사용하지 않더라도 매개변수가 반드시 네 개여야 한다. 첫 번째 매개변수 err에는 에러에 관한 정보가 담겨있다. res.status 메서드로 HTTP 상태 코드를 지정할 수 있다. (기본값은 200) 에러 처리 미들웨어를 직접 연결하지 않아도 기본적으로 익스프레스가 에러를 처리하긴 한다. 하지만 실무에서는 직접 에러 처리 미들웨어를 연결해주는 것이 좋다. 에러 처리 미들웨어는 특별한 경우가 아니라면 가장 아래에 위치하도록 한다.

미들웨어의 특성

미들웨어의 특성

express 미들웨어에서 next(), next(’route’), return next()의 차이

  1. next(): 다음 미들웨어 함수를 호출합니다.
  2. next('route'): 다음 라우트로 이동합니다. 현재 라우트에서 다음 미들웨어를 건너뛰고 다음 라우트의 미들웨어를 실행합니다.