https://docs.nestjs.com/middleware
NestJS 공식 Docs를 확인하면 Middleware를 Logger형식으로 설명해놓았다.
이를 참고해서 Middleware를 공부하기 참 좋았다.
Class형 Middleware와 Functional Middleware를 모두 구현했고,
종속성이 필요 없다면 기능적 미들웨어 대안을 사용하는게 좋다고 한다.
- Class형 사용 방법
// app.modules.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './utils/logger.middleware';
...
export class AppModule implements NestModule{
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware) // multiple middleware ex) apply(cors(), helmet(), logger)
.forRoutes('DiscordController') // global: '*', /cats: 'cats'
}
- 함수형 사용 방법
// main.ts
import { logger } from './utils/logger.middleware';
app.use(logger);
함수형이 훨씬 간단하고 사용 방법도 express와 동일하다.
이제 log 출력을 위해 nest-morgan을 설치하자.
https://www.npmjs.com/package/nest-morgan
npm usage를 따라하면 된다.
근데 출력되는 콘솔이 쌩 콘솔이라 가독성이 별로고 예쁘지 않다.
그래서 logger middleware를 morgan과 동일하게 수정했다.
// logger.middleware.ts
import { Injectable, Logger, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";
//class
@Injectable()
export class LoggerMiddleware implements NestMiddleware{
private logger = new Logger('HTTP');
use(req: Request, res: Response, next: NextFunction){
const { ip, method, originalUrl } = req;
const userAgent = req.get('user-agent') || '';
res.on('finish', () => {
const { statusCode } = res;
const contentLength = res.get('content-length');
this.logger.log(
`${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`,
);
});
next();
}
}
//functional middleware -> 종속성이 필요 없을 경우 기능적 미들웨어 대안을 사용하는게 좋음.
//useage: main.ts -> app.use(logger) / app.modules.ts -> apply(logger)
export function logger(req: Request, res: Response, next: NextFunction) {
const logger = new Logger('HTTP');
const { ip, method, originalUrl } = req;
const origin = req.get('origin');
const userAgent = req.get('user-agent') || '';
res.on('finish', () => {
const { statusCode } = res;
const contentLength = res.get('content-length');
logger.log(
// `${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`,
`${method} ${originalUrl} ${statusCode} - ${origin} ${userAgent} ${ip}`,
);
});
next();
};
이렇게 수정하고 나는 함수형 로거를 사용중이다.
Vladimir Agaev님의 도움을 받았다.
출처: https://javascript.plainenglish.io/how-to-use-nestjs-logger-2a9cb107bce9
'Server > NodeJS & NestJS' 카테고리의 다른 글
NestJS) JwtModule에서 .env 호출이 되지 않을 때 (0) | 2022.04.21 |
---|---|
NestJS에서 Prisma 사용하기 (0) | 2022.03.15 |
cors 오류 임시로 해결하기 (0) | 2022.03.08 |
nodemailer, google gmail smtp) 문의하기 메일 보내기 (0) | 2022.02.22 |
Typescript에서 TypeORM과 paAdmin4 사용하기. (0) | 2022.02.08 |