Nodejs Chap6-1 Express

jade·2025년 2월 23일

Node.js

목록 보기
8/11

1. express

1) express 다운받기

npm i express

2) express 간단히 이용해보기

express를 쓰면 앞장에서 살펴본 것처럼 if 문으로 도배하지 않아도 된다.
훨씬 간단한 코드가 가능해짐

const express = require('express');
const app = express();
const path = require('path');
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('express 서버 실행');
});

2. 미들웨어

여러 종류의 미들웨어가 존재, 미들웨어 간의 코드순서도 중요

1) 애플리케이션 레벨 미들웨어

use이용, next()로 실행
모든 라우터에 적용할 수 있도록 함

next(): next를 호출해야 다음 코드로 넘어감

  • next에 인수로 값을 넣으면 에러 핸들러로 넘어감
  • next('route'): 인수에 route가 들어간 경우만 다음 라우트로 이동

코드 예제
/category/:name 라우터: 라우트 파라미터로 변수처럼 이용
예를 들어, http://localhost:3000/category/python → hello python 이 나타남

//6.1, app.js
const express = require('express');
const app = express();
const path = require('path');

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

//use -> 미들웨어, 모든 라우터에 실행됨
//next()로 실행해줘야함
app.use((req, res,next) => {
    console.log("모든 요청에 실행됨");
    next();
});

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'index.html'));
});
app.get('/category/javascript',(req, res)=> {
    res.send('hello javascript');
});
//404같은 오류가 날때 처리하기 좋음
app.get('*', (req, res) => {
    res.send('*'); 
});
app.listen(app.get('port'), () => {
    console.log('express 서버 실행');
});

2 ) 라우터 레벨 미들웨어

특정 라우터에만 작동

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'index.html'));
})

3) 에러 처리 미들웨어

err,req,res,next까지 매개변수 4개 이용
res.status() -> HTTP 상태 코드 지정(기본값200)
특별한 경우가 아니면 가장 아래에 위치

코드 예제: 에러를 발생시키는 미들웨어를 넣은 뒤, 그 에러를 처리

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

app.set('port', process.env.PORT || 3000);
//두개의 미들웨어
//첫번째: 요청이 올때마다 console.log를 출력하고 다음 미들웨어로 넘어감
//두번째: 에러를 발생시키고 next(error)로 에러를 다음 핸들러로 넘김
app.use((req, res,next) => {
    console.log("모든 요청에 실행됨");
    next();
}, (req, res, next) => {
    try { console.log(asdf); }
    catch (err) {
        next(err);
    }
});

app.get('/', (req, res) => { 
    res.json({ hello: 'jade' });
    console.log('hello jade');
;}); 

//error 처리
app.use((err,req, res, next) => {
    res.status(200).send('404발생');
    console.log(err);
});
app.use((err,req, res, next) => {
    res.status(200).send('에러가 발생했어요ㅜ');
})

app.listen(app.get('port'), () => {
    console.log('express 서버 실행');
});

4) 서드파티 미들웨어

외부 라이브러리 사용: 대표적으로 morgan, cookie-parser, express-session, multer
npm i margan cookie-parser express-session : 설치

1. morgan, cookie-parser 예제코드

  • morgan : 어디서 어떤 http 코드를 받았는지 알 수 있음
  • cookie-parser: 쿠키 관련 조작
const express = require('express');
const app = express();
const path = require('path');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');

app.set('port', process.env.PORT || 3000);
app.use(morgan('dev')); // GET / 301 라는 console.log가 뜸
app.use(cookieParser('zerochopasswd')); 

// 루트 경로
app.get('/', (req, res) => {
    req.cookies;  
    req.signedCookies; //쿠키 암호화
    res.cookie('name', encodeURIComponent(name), {
        expires: new Date(),
        httpOnly: true,
        path:'/'
    });
    res.clearCookie('name', encodeURIComponent(name), {
        httpOnly: true,
        path: '/'
    });
    res.sendFile(path.join(__dirname, 'index.html'));
});

app.listen(app.get('port'), () => {
    console.log('express 서버 실행');
});

2. express-session 코드예제
-> 세션 관리용, 로그인/로그아웃 기능을 할때 많이 쓰임

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

app.use(session({
    secret: 'mySecretKey',      // 세션 암호화에 사용될 키
    resave: false,              // 세션을 강제로 저장할지 여부
    saveUninitialized: false,   // 초기화되지 않은 세션을 저장할지 여부
    cookie: { secure: false }   // true면 HTTPS에서만 쿠키 전송
}));

app.get('/', (req, res) => {
    req.session.user = '홍길동'; // 세션에 사용자 저장
    res.send('세션 생성 완료');
});

app.get('/session-check', (req, res) => {
    if (req.session.user) {
        res.send(`세션 사용자: ${req.session.user}`);
    } else {
        res.send('세션 없음');
    }
});

app.get('/logout', (req, res) => {
    req.session.destroy((err) => {
        if (err) return res.send('로그아웃 실패');
        res.send('로그아웃 완료');
    });
});

app.listen(3000, () => {
    console.log('서버 실행 중...');
});

3. multer

  • multer는 파일 업로드를 처리
  • 디스크 저장, 메모리 저장 모두 가능
  • 파일 크기, 형식 제한 등 다양한 옵션 제공
  • 프로필 사진, 게시판 첨부파일, 이미지 갤러리 같은 기능 구현에 필수

+)dotenv: 민감한 데이터를 별도의 파일에 저장하고 안전하게 불러올 수 있음
ex) key를 환경변수에 숨겨넣는 방법

//dotenv.js
const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config(); //dotenv!
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)); //dotenv! 환경변수에 저장
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET, //dotenv!
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie',
}));

const multer = require('multer');
const fs = require('fs');
//uploads 폴더가 있는지 확인, 없으면 생성
try {
  fs.readdirSync('uploads');
} catch (error) {
  console.error('uploads 폴더가 없어 uploads 폴더를 생성합니다.');
  fs.mkdirSync('uploads');
}
const upload = multer({
 //storage: 업로드한 파일을 어디에 저장할 것인지, 어떤 이름으로 저장할 것인지
  storage: multer.diskStorage({
    destination(req, file, done) {
      done(null, 'uploads/'); //파일 저장위치
    },
    filename(req, file, done) { //파일 이름
      const ext = path.extname(file.originalname);
      done(null, path.basename(file.originalname, ext) + Date.now() + ext);
    },
  }),
  //limits: 파일 사이즈, 개수
  limits: { fileSize: 5 * 1024 * 1024 },
});

app.get('/upload', (req, res) => {
  res.sendFile(path.join(__dirname, 'multipart.html'));
});
//POST 요청 시 파일 업로드 처리
//input 태그의 name="image"인 파일 하나만 업로드, 성공하면 ok
app.post('/upload', upload.single('image'), (req, res) => {
  console.log(req.file);
  res.send('ok');
});

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

5) 내장 미들웨어 (Express 기본 제공)

express.static: 정적 파일 제공
express.json: JSON 데이터 처리

app.use(express.json());
app.use('/', express.static(__dirname, 'public'));
//'요청경로', express.static('실제경로')

0개의 댓글