1. 미들웨어
nest g middleware 미들웨어명
logger라는 이름으로 middleware를 생성해보자
nest g middleware logger
그러면
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
next();
}
}
위와같이 미들웨어가 생성되고
express 에서 봤던 use가 보인다
req,res,next 타입을 express 의 request,response, nextFunction으로 변경해보자
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(req.ip);
next();
}
}
이렇게만 하면 사용을 할수가 없다
어노테이션을보면 마치 공급자였던 service를 연상케 한다
그래서 얘도 마찬가지로
module로가서 공급자등록을 해줘야하는데
module에는 미들웨어를 위한 전용장소가 없기때문에 따로 만들어줘야함
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { UsersModule } from './users/users.module';
import { LoggerMiddleware } from './logger/logger.middleware';
@Module({
imports: [CatsModule, UsersModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('cats');
}
}
위를 보면 forRoutes('cats') 는 cats 라우터에 바인딩 시켜주는건데
만약 이게없이 ('*') 게 하면 전체 엔드포인트에대해 loggermiddleware가 실행되는것임
이제 nestjs 답게 사용을 해보자
nestjs는 로깅을 할때 logger라는 class를 사용한다
logger.middleware
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
private logger = new Logger();
use(req: Request, res: Response, next: NextFunction) {
this.logger.log(req.ip, req.originalUrl);
next();
}
}
nestjs는 로깅을 할때 Logger을 주로 쓴다
res가 다 끝난후에 로그를 찍고싶다면
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
private logger = new Logger();
use(req: Request, res: Response, next: NextFunction) {
res.on('finish', () => {
this.logger.log(
`${req.ip} ${req.method} ${res.statusCode}`,
req.originalUrl,
);
});
next();
}
}
반응형
'웹 개발 > 🟩 Node.js' 카테고리의 다른 글
NestJS | Interceptors & AOP 패턴 (0) | 2024.02.29 |
---|---|
NestJS | Exception filter & Pipes (1) | 2024.02.28 |
NestJS | Modules & 캡슐화 (0) | 2024.02.14 |
NestJS | Providers & 의존성 주입(DI) (0) | 2024.02.13 |
NestJS | 구조 & Controller 패턴 (0) | 2024.02.13 |