Node.js + Express를 이용한 RESTful API 예제(7) - middleware 기능을 이용한 Interceptor 작성

minhye kim·2024년 5월 21일

nodejs

목록 보기
7/10

express의 middleware 기능을 이용하여 좀더 코드를 깔끔하게 response 형식을 공통화화고, index.ts에서 middleware 기능을 따로 분리하여 각각 기능별로 관리하도록 하겠습니다.

response interceptor하여 공통처리

response에서 responseCode 200으로 성공인 경우에는 공통처리를 하고 다음 미들웨어로 넘어가지 않고 종료하도록 처리합니다.

import { NextFunction, Request, Response } from 'express';

const responseFilter = (req: Request, res: Response, next: NextFunction) => {
  console.log('[ responseFilter ]=============');
  console.log(res.statusCode);
  if (res.statusCode == 200) {
    const result = res.locals.apiResponse;
    res.status(200).send({
      status: 200,
      success: true,
      data: result
    });
  } else {
    next();
  }
};

export default responseFilter;

commonLog.ts 작성

기존에 index.ts의 app.use안에 작성한 request 요청시마다 선 실행되었던 코드를 분리하여 따로 작성합니다.

import { NextFunction, Request, Response } from 'express';

const commonLog = (req: Request, res: Response, next: NextFunction) => {
  console.log('[ commonLog ]==================');
  console.log('requestURL: ' + req.url);
  console.log('requestMethod: ' + req.method);
  if (req.method !== 'GET') {
    console.log('requestBody: ' + JSON.stringify(req.body));
  }
  next();
};

export default commonLog;

commonError.ts 작성

기존에 index.ts의 app.use안에 작성한 error handling 관련 소스를 분리하여 따로 작성합니다.

import { NextFunction, Request, Response } from 'express';

const commonError = (
  err: { message: string },
  req: Request,
  res: Response,
  next: NextFunction
) => {
  console.error('[ commonError ]================');
  console.error(`[errMessage]: ${err.message}`);
  res.status(500).send({
    status: 500,
    success: false,
    message: 'Server Error',
    error: err.message
  });
};

export default commonError;

분리된 내용을 index.ts에 적용

middleware는 위치에 따라 적용 순서가 변경되므로 순서에 유의하여 아래와 같이 작성합니다.

import commonLog from './middleware/commonLog';
import responseFilter from './middleware/responseFilter';
import commonError from './middleware/commonError';

// middleware - log
app.use(commonLog);

// ETH api
const router = express.Router();
router.use('/eth', ethRouter);
app.use('/api', router);

// middleware - response format
app.use(responseFilter);

// error handling
app.use(commonError);

Reference
https://expressjs.com/en/guide/writing-middleware.html
https://www.geeksforgeeks.org/how-to-intercept-response-send-response-json-in-express-js/

profile
안녕하세요. 블로그를 시작하게 되었습니다! 앞으로 유용한 정보와 좋은 내용을 많이 공유할게요:)

0개의 댓글