- Today
- Total
개발하는 고라니
[Node.js] Middleware 생성 본문
이전에 Body-parser라는 어떤 고마운 분이 만들어준 미들웨어를 사용해보았다. 그런데 신기하게도, request에 body라는 property가 없었는데 어떻게 생긴걸까? 간단한 미들웨어를 만들어며 알아보자.
Express의 Guide탭 중에 'Writing Middleware'라는 항목을 보면, 다음과 같은 예시가 있다.
var express = require('express')
var app = express()
var myLogger = function (req, res, next) {
console.log('LOGGED')
next()
}
app.use(myLogger)
app.get('/', function (req, res) {
res.send('Hello World!')
})
app.listen(3000)
어...한눈에 보기에 불편하다.. 무슨 말인가? 했더니
var myLogger = function (req, res, next) {
console.log('LOGGED')
next()
}
app.use(myLogger)
------------------------------------------------------------------
app.use(function (req, res, next) {
console.log('LOGGED');
next();
})
위 아래 둘다 같은 코드이다. 즉, Middleware는 함수를 호출하는 것이었다.
1번 인자로 request 객체
2번 인자로 response 객체
3번 인자로 next 라는 값을
파라미터로 갖는 함수를 호출하는 것이다.
# 사용 예
* 다음과 같이 특정 디렉토리의 파일들의 이름을 읽어 List에 담아 반환하는 기능을 미들웨어로 만들어보자.
app.get('/', (request, response) => {
fs.readdir(`C:/Users/82102/Nodejs-express/data`, (err, fileList) => {
if(err) throw err;
console.log(fileList);
})
})
/*
[
0|main | 'CSS',
0|main | 'Example',
0|main | 'Express',
0|main | 'HTML5',
0|main | 'JavaScript',
0|main | 'JavaScript^^',
0|main | 'MongoDB',
0|main | 'XSS'
0|main | ]
*/
위와 같이 fs.readdir(`C:/Users/82102....)가 무수히 많이 반복된다고 생각했을 때, 저걸 일일이 다 타이핑하거나 복붙해야한다. 너무 귀찮은 일이다.
미들웨어로 만든다면 다음과 같다.
app.use((request, response, next) => {
fs.readdir("C:/Users/82102/Nodejs-express/data", (err, fileList) => {
if(err) throw err;
request.list = fileList;
next(); //next에는 그 다음에 호출되어야 할 미들웨어가 담겨있다.
})
})
이제 만들어진 미들웨어를 사용하여 코드를 변경해보자.
app.get('/', (request, response) => {
const list = request.list;
console.log(list);
})
/*
[
0|main | 'CSS',
0|main | 'Example',
0|main | 'Express',
0|main | 'HTML5',
0|main | 'JavaScript',
0|main | 'JavaScript^^',
0|main | 'MongoDB',
0|main | 'XSS'
0|main | ]
*/
정말 간단해졌다. 이제 더이상 fs.readdir(...) 같은 복잡한 코드를 반복하지 않아도 된다.
다만, 위 방식은 특정 디렉토리의 파일 목록을 사용하지 않는 URL에 접근할 때도 실행이 된다.(사용되진 않지만 뒤에서 실행된다.) 따라서 불필요한 리소스를 소모하는 것 이다. 이를 조금이나마 줄이고자 'get'요청이 들어올 때만 이 작업이 실행되게 변경해보자.
* 미들웨어 선언 할 떄 .use를 .get으로 바꾼다.
//'*'는 get방식으로 접근하는 모든 url에 대해 허용한다는 뜻
app.get('*', (request, response, next) => {
fs.readdir("C:/Users/82102/Nodejs-express/data", (err, fileList) => {
if(err) throw err;
request.list = fileList;
next(); //next에는 그 다음에 호출되어야 할 미들웨어가 담겨있다.
})
})
<본 내용은 생활코딩을 참고로 하여 작성되었습니다.>
'Framework > Node.js' 카테고리의 다른 글
[Node.js] Node.js Tutorial (3) - File System (0) | 2021.04.16 |
---|---|
[Node.js] Node.js Tutorial (2) (0) | 2021.04.16 |
[Node.js] Node.js Tutorial (1) (0) | 2021.04.16 |
[Node.js] Express Middleware의 Types (0) | 2021.01.08 |
[Node.js] Body-parser (0) | 2021.01.08 |