복's

[ Nest JS ] 미들웨어(Middleware) 설정 본문

교육/SW 정글 프로젝트(나만무)

[ Nest JS ] 미들웨어(Middleware) 설정

나복이 2023. 11. 15. 20:47
728x90

[ Middleware in node.js ]

Middleware는 express 할 때 다뤄봤는데 middleware의 특징으로는 request와 response 객체와 next() 함수에 접근이 가능하다는 것이다.

 

나는 사용하고자 하는 큰 이유는 없었고, request가 들어왔을 때 어떤 url을 타고온 요청이 어떤 parameters 가지고 있는지 console창에 찍어서 편하게 보고 싶었다.

 

적용하는것도 크게 어렵지 않았다.

 

1. AppModule

@Module 데코레이터에서는 등록하지 않고, module 클래스의 configure() 메소드에서 세팅해야한다.

그리고 미들웨어는 NestModule(@nestjs/common)을 구현해야 한다.

export class AppModule implements NestModule{
    configure(consumer: MiddlewareConsumer): any {
        consumer.apply(DoWithMiddlewareMiddleware)
                .forRoutes('');
    }
}

공식 문서를 따라하면 어렵지 않게 세팅할 수 있다.

forRoutes를 비워놓은 이유는 모든 경로에 대한 request 요청을 확인할 예정이기 때문이다. 

하지만 특정 url만 보고 싶다면 ex) 'cats' 혹은 '/cats'를 적으면 된다.

 

[ 특정 url + HTTP method 만 가능 ]
.forRoutes({ path: 'cats', method: RequestMethod.GET });

[ wildcards를 이용한 루트 설정 ]
forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });

공식 문서에서 확인할 수 있으며 위와 반대로 특정 url을 제외하는 방법도 exclude를 사용하면 가능하다.

[ 특정 url + HTTP method 제외 ]
.exclude({ path: 'cats', method: RequestMethod.GET })

[ wildcards를 이용한 특정 url 경로 제외 ]
.exclude('cats/(.*)')

물론 여러개의 미들웨어도 등록할 수 있다.

consumer.apply(Middleware1, Middleware2);

그리고 전역적으로 설정하는 방법은 main.ts 에서 app.use(미들웨어명) 으로 등록할 수 있다.

 

2) Middleware

그냥 내가 콘솔에 찍어서 보고싶어서 만든 미들웨어 (사실 미들웨어에서 아직 무슨 작업을 해야할지 감이 잡히지 않았다.)

import { Inject, Injectable, Logger, LoggerService, NestMiddleware } from '@nestjs/common';

@Injectable()
export class DoWithMiddlewareMiddleware implements NestMiddleware {
    use(req: any, res: any, next: () => void) {
        const logHeader    = `=============== [${req.method}] ${req.url} ===============`;
        const logDate      = `date     : ${new Date()}`;
        const logAgent     = `agent    : ${req.headers['user-agent']}`;
        const logClientIp  = `client Ip: ${req.ip}`;
        const logProxyIps  = `proxy Ips: ${req.ips}`;
        const {password, ...paramsWithoutPassword} = req.body;

        const keys = Object.keys(paramsWithoutPassword);
        var params = "";

        if(keys.length !== 0){
            params = "=============== [ Parameters ] ===============\n";

            keys.forEach((key) => {
                const value = paramsWithoutPassword[key];
                params += `${key} = ${value}\n`;
            });
        }

        console.log(`
${logHeader}
${logDate}
${logAgent}
${logClientIp}
${logProxyIps}
${params}
        `);
    
        next();
    }
}

[ Console ]

위의 그림이 내가 콘솔로 보고자 했던 텍스트이며, 물론 개발할 때 세팅해놓은 logging 라이브러리(winston)을 사용해도 되지만 매번 썼다가 지우는게 귀찮아서...

[ Console - winston ]

물론 색감도 있고 보기 깔끔한건 winston인 것 같다.

하지만 내가 원하는 대로 찍어볼 수 있으니까 나름 괜찮을지도...?

 

필요한 내용은 공식 docs에 다 있다. 나름 읽기 편하게 정리 잘 되어 있는 것 같다.

https://docs.nestjs.com/middleware#functional-middleware

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

728x90