가자미의 개발이야기

[Node.js] 자주 사용하는 미들웨어(모듈) 본문

HTML & CSS & JS/Node.js

[Node.js] 자주 사용하는 미들웨어(모듈)

가자미 2021. 5. 11. 23:34

1. dotenv

.env 파일을 읽어서 process.env로 만듦

키=값 형식으로 구성

비밀 키를 소스코드와 분리하기 위함

 

2. morgan

서버로 들어온 요청과 응답을 기록해주는 미들웨어

개발환경에서는 'dev', 배포 환경에서는 'combined'를 애용

app.use(morgan('dev'));

 

3. static

정적인 파일들을 제공하는 미들웨어

인수로 정적 파일의 경로를 제공

파일이 있을 때 fs.readfile로 읽어들일 필요가 없음

요청하는 파일이 없을 경우 next를 호출해 알아서 다음 미들웨어로 넘어감.

파일을 발견했다면 다음 미들웨어는 실행되지 않음

컨텐츠 요청 주소와 실제 컨텐츠의 경로를 다르게 만들 수 있음.

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

 

4. body-parser

요청의 본문을 해석해주는 미들웨어

폼 데이터나 ajax 요청의 데이터 처리

json 미들웨어는 요청 본문이 json인 경우 해석, urlendcoded 미들웨어는 폼 요청 해석

put이나 patch, post 요청 시에 req.body에 프런트에서 온 데이터를 넣어줌

app.use(express.json());
app.use(express.urlencoded({exteded:false}));

 

버퍼 데이터나 text 데이터일 때는 body-parser를 직접 설치해야 함

const bodyParser = require('body-parser');

app.use(bodyParser.raw());
app.use(bodyParser.text());

 

5. cookie-parser

요청 헤더의 쿠키를 해석해주는 미들웨이

req.cookies 안에 쿠키들이 들어있음.

비밀 키로 쿠키 뒤에 서명을 붙여 내 서버가 만든 쿠키임을 검증

app.use(cookieParser(비밀키));

 

실제 쿠키 옵션들을 넣을 수 있음

expires, domain, httpOnly, maxAge, path, secure, sameSite 등

지울 때는 clearCookie로(expire와 maxAge를 제외한 옵션들이 일치해야.)

res.cookie('name', 'gazami',{
	expires: new Date(Date.now() + 900000),
    httpOnly: true,
    secure: true,
});
res.clearCookie('name', 'gazami',{httpOnly:true, secure: true});

 

6. express-session

세션 관리용 미들웨어

세션 쿠키에 대한 설정(secret: 쿠키 암호화, cookie: 세션 쿠키 옵션)

세션 쿠키는 앞에 s%3A가 붙은 후 암호화되어 프론트에 전송.

app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
    	httpOnly: true,
        secure: false,
    },
    name: 'session-cookie',
}));

req.session.name='gazami';//세션등록
req.seesionID;//세션아이디 확인
req.session.destroy();//세션 모두 제거

resave : 요청이 왔을 때 세션에 수정사항이 생기지 않아도 다시 저장할지 여부

saveUninitialized : 세션에 저장할 내역이 없더라도 세션에 저장할 지

req.session.save로 수동 저장도 가능(별로 사용x)

 

7. multer

멀티파트 데이터 형식을 해석

const multer = require('multer');

const upload = multer({
	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: {fileSize : 5 * 1024 * 1024},
});

storage : 저장공간 확보

diskStorage : 하드디스크에 업로드 파일 저장

destination : 저장할 경로

filename : 저장할 파일명(파일명+날짜+확장자 형식)

Limits 파일개수나 파일 사이즈 제한

실제 서버 운영시 서버 디스크 대신 S3같은 스토리지 서비스에 저장(storage 옵션 변경)

 

app.post('/upload', upload.single('image'), (req,res)=>{
	console.log(req.file, req.body);
    res.send('ok');
});

app.post('/upload', upload.none(), (req, res)=>{
	console.log(req.body);
    res.send('ok');
});

single : 하나의 파일 업로드

none : 파일 업로드 하지 않음

array : 하나의 요청 body 이름 아래 여러 파일 업로드

fileds : 여러 개의 요청 body 이름 아래 파일이 하나씩

(array, fileds 모두 업로드 된 이미지 정보가 req.files 아래에 존재)