본문 바로가기

Programming/Node.js

7. 익스프레스 (1) - 미들웨어 [9] : 미들웨어의 특성 정리 2

node js logo image

 

 

 

 

앞선 아티클에서 전반적인 미들웨어의 특성에 대해 정리했습니다. 이어서 계속 살펴보겠습니다. 

 

 

 

7. 익스프레스 (1) - 미들웨어 [9] : 미들웨어의 특성 정리 1

- 미들웨어는 req, res, next를 파라미터로 갖는 함수로서 app.use / app.get / app.post 등으로 장착합니다. - 에러 처리 미들웨어는 예외적으로 err, req, res, next를 파라미터로 가지게 됩니다. app.use((req, res,

nozeroslope.tistory.com

 

 

- 미들웨어 간에 데이터를 전달하는 방식에는 세션을 사용하는 방법이 있습니다. req.session 객체에 데이터를 넣는 방식이죠. 단, 이는 세션이 유지되면 데이터도 무조건 계속 유지된다는 단점이 있습니다. 

 

- 요청이 끝날 때까지만 데이터를 유지하고자 한다면, res.locals 객체에 데이터를 넣으면 됩니다. 이를 사용하면, 새로운 요청이 발생했을 때는 res.locals의 데이터는 초기화 됩니다. 

 

app.use((req, res, next) => {
    res.locals.data = '데이터 삽입';
    next();
}, (req, res, next) => {
    console.log(res.locals.data);   // 데이터 받기
    next();
});

 

 

- app.set으로 데이터를 설정하고 이를  app.get, 또는 req.app.get으로 불러올 수 있다는 것도 살펴본 적이 있습니다. 하지만, app.set은 익스프레스에서 전역적으로 사용되므로, 하나의 요청에서만 유지해야 하는 값을 전달하는데는 부적절하고, 앱 전체의 설정을 공유할 때 사용해야 합니다. 

 

 


 

 

미들웨어 사용 시 유용한 패턴인, 미들웨어 안에 미들웨어 넣기 패턴을 보겠습니다. 아래 예제의 두 라인은 같은 기능을 합니다.

 

app.use(morgan('dev'));
// or
app.use((req, res, next) => {
    morgan('dev')(req, res, next);
});

 

 

이러한 방식을 사용하면 미들웨어 사용에 있어서 기능 확장이 가능합니다. 예를 들어, 분기 처리가 아래와 같이 가능합니다.

 

app.use((req, res, next) => {
    if(process.env.NODE_ENV === 'production') {
        morgan('combined')(req, res, next);
    } else {
        morgan('dev')(req, res, next);
    }
});