npm i 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 서버 실행');
});
여러 종류의 미들웨어가 존재, 미들웨어 간의 코드순서도 중요
use이용, next()로 실행
모든 라우터에 적용할 수 있도록 함
next(): next를 호출해야 다음 코드로 넘어감
코드 예제
/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 서버 실행');
});
특정 라우터에만 작동
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
})
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 서버 실행');
});
외부 라이브러리 사용: 대표적으로 morgan, cookie-parser, express-session, multer
npm i margan cookie-parser express-session : 설치
1. morgan, 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
+)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
express.static: 정적 파일 제공
express.json: JSON 데이터 처리
app.use(express.json());
app.use('/', express.static(__dirname, 'public'));
//'요청경로', express.static('실제경로')