미들웨어 : 가운데에서 연결점 역할을 하는 것. request-response사이클 안에서 routing handler함수가 가지고 있는 request객체, response객체, next함수에 대한 접근이 가능한 함수이다 -> 요청에 응답하는 중간에 목적에 맞게 처리할때 거쳐가는 함수.
- request, response객체 수정이 가능하다
- request, response사이클을 끝낼 수도 있고 다음 미들웨어를 호출할 수도 있다.
대표적인 미들웨어
- error-handling middleware
매개변수를 3개(request, response, next)를 가지고 있는 일반적인 middleware와는 달리 4개(error, req, res, next)의 매개변수를 갖는 middleware이다.
app.use((req, res, next) => {
const error = new Error("Resource Not Found");
error.statusCode = 404;
next(error);
});
app.use((error, req, res, next) => {
console.log(error);
res.statusCode = error.statusCode;
res.json({
error: error.message,
data: null,
});
});
근데 만약 middleware/handler함수가 동기함수라면 throw문법으로도 error-hanling middleware로 error를 넘길 수 있다. 비동기는 불가(try-catch로 error를 잡아서 next로 전달해야 한다)
예시)
app.get('/something', async (req,res,next) => { //안에 내용에 비동기방식이 들어간다면 async를 붙인다
try{
//비동기내용을 넣어야한다.
}catch(err){
}
})
또는
app.get('/something', async (req,res,next) => { //안에 내용에 비동기방식이 들어간다면 async를 붙인다
const prom = new Promise((resolve, reject)=>{
resolve();
}).catch(error => next(error))
})
- body-parser
- multer
- cookie-parser
- session
- morgan
app.use() : 미들웨어를 등록시키는 express모듈이다.
app.use(myLogger1); 로 미들웨어를 등록했다.
const express = require('express')
const app = express();
const port = 3000;
const myLogger1 = function (req,res,next){
console.log('LOGGED1');
next()
}
const myLogger2 = function (req,res,next){
console.log('LOGGED2');
next()
}
app.use(myLogger1);
app.get('/', (req,res)=>{
res.send('Hello World')
})
app.post('/', (req,res)=>{
res.send('Hello World')
})
app.listen(port, ()=>{
console.log(`Example app listening on port ${port}`)
})
이렇게 등록할 수도 있고 get이나 post요청 중간에 함수를 넣어서 미들웨어를 추가해줄수도 있다.
const express = require('express')
const app = express();
const port = 3000;
const myLogger1 = function (req,res,next){
console.log('LOGGED1');
next(); //미들웨어에서는 next()를 꼭 해주어야 한다
}
const myLogger2 = function (req,res,next){
console.log('LOGGED2');
next();
}
app.get('/', myLogger1, (req,res)=>{
res.send('Hello World')
})
app.post('/', myLogger2, (req,res)=>{
res.send('Hello World')
})
app.listen(port, ()=>{
console.log(`Example app listening on port ${port}`)
})
미들웨어 작성법
req,res,next를 인자로 갖는 함수를 작성하면 미들웨어가 된다.
req,res객체를 통해 HTTP요청과 응답을 처리하거나 next함수를 통해 다음 미들웨어를 호출한다.
next()를 호출하지 않으면 멈추니 주의한다.
위 두개 함수는 둘다 미들웨어이다.
미들웨어를 거치며 변수도 주고 받을 수 있다.
미들웨어는 세가지가 있다
1. 어플리케이션 미들웨어
2. 라우터미들웨어
미들웨어서브스텍)
오류처리미들웨어
일반적으로 가장 마지막에 위치하는 미들웨어. err, req, res, next네가지 인자를 가진다. 앞선 미들웨어에서 next함수에 인자가 전달되면 실행된다. next함수에 인자를 전달하면 오류처리 미들웨어가 실행된다.
필요한 동작 방식에 따라 미들웨어를 적용할 위치를 결정한다.
또 다른 예제
const express = require('express');
const app = express();
const hasError = (req, res, next) => {
next('ERROR');
};
app.get('/', (req, res) => {
res.send('OK');
});
app.get('/success', (req, res) => {
res.send('SUCCESS');
});
app.get('/fail', hasError, (req, res) => {
res.send('FAIL');
});
// 오류처리 미들웨어 추가하기
app.use((err, req, res, next) => {
res.send(`Request failed with ${err}`);
});
app.listen(8080);
함수형 미들웨어
함수형 미들웨어 예제
index.js
const express = require('express');
const usersRouter = require('./routes/users');
const adminRouter = require('./routes/admin');
const setUser = require('./middlewares/set-user');
const adjuerQuery = require('./middlewares/adjust-query');
const app = express();
app.use(adjuerQuery);
app.get('/', (req, res) => {
res.send('OK');
});
app.use('/users', setUser('users'), usersRouter);
app.use('/admin', setUser('admin'), adminRouter);
app.listen(8080);
middlewares -> set-user.js
const users = require('../data/users');
const admins = require('../data/admins');
const setUser = type => (req, res, next) => {
const { userName } = req.query;
if (type === 'admin') {
req.user = admins[userName];
next();
return;
}
req.user = users[userName];
next();
};
module.exports = setUser;
관련 코드 :
코드를 실행하면 이제 localhost로 들어가면 네이버 나온다. 로컬호스트에서 어떤 페이지를 보여주는게 아니기때문에 resp.writeHead, resp.end가 없다.
const express = require('express');
const app = express();
app.use((req,resp)=>{
console.log('첫번째 미들웨어 실행');
md1(req,resp); //이게 미들웨어
}).listen(3000,()=>{
console.log('3000번 포트로 실행중..');
});
function md1(req,resp){
console.log('첫번째 미들웨어 실행!');
resp.redirect('https://www.naver.com');
}
Express.js어플리케이션 개발 시 사용되는 서드 파티 모듈
'Node' 카테고리의 다른 글
JSON.parse와 JSON.stringify (0) | 2022.07.04 |
---|---|
ejs에 대해 알아보기 (0) | 2022.07.03 |
이미지나 음악파일을 보여지게하기(fs.readFile) (0) | 2022.07.03 |
try catch finally를 이용한 예외처리 (0) | 2022.07.03 |
fs모듈 사용해 동기식/비동기식으로 txt파일 읽기, 쓰기(readFile, readFileSync,writeFile,writeFileSync) (0) | 2022.07.03 |