Express Request 새로운 object 확장

서론

Express를 활용하여 server 프로그램을 만들다보면 세션관리와 같은 일에서 미드웨어로 처리하고 Request에 새로운 Object값을 추가로 넣어줘야하는 경우가 발생합니다.

방법

아래의 방법을 순차적으로 따른다.

src/entity/<interface_name.ts> 파일 생성

전달하고자하는 자료형을 미리 정의해준다.
(경로는 자유롭게 해도 상관없지만 위의 경로를 추천한다.)
interface로 선언, type로 선언하게 되면 Request에 전달할수가 없습니다.

export interface Member  {
    uno?: number; uid?:string; uname? : string; 
    unick?:string, camp_style?:string; 
    profile_img?: string; 
  } 

src/@types/<type_file_name.ts> 파일을 추가

Express안에 Request interface안에 있는 member의 자료형을 위에서 만든 Member라는 interface로 고정시켜 줍니다. 그래야 member라는 자료형에 접근하였을때 자료형에 관련된 에러메세지가 발생하지 않습니다.
export {}를 왜 넣어줘야하는지 이해가 되지 않는다. 저것 때문에 자료형을 바로 불러오고있다(import('../entity/Meber').Member).

type_file_name.ts

export {}
declare global{
    namespace Express{
      interface Request{
        member : import('../entity/Meber').Member;
      }
    }
  } 

Middleware에서 object에 넣어주기

이제 미들웨어에서 사용하여 추가하면 된다. 쿼리로부터 id를 받아오고 그 정보를 토대로 member를 만들어서 req에 추가 하면된다.

src/middleware/<middleware_name.ts>

middleware_name.ts


import { NextFunction, Request, Response } from "express";
import {Member} from "../model/data/member/Member";

const middleware = async(eq: Request, res: Response, next: NextFunction) => {
  
  const {id} = req.query;
  if(!uid) return next();
  
  const userInfo =  await Member.findOne({where : {uid}, paranoid:false});
  req.member = {uno : userInfo?.uno, .....  }
  
  return next();
}

req.new_object사용하기

middleware를 express에 추가하고 나면 아래와 같이 해당 object에 접근이 가능하다.
예제에서는 member이다.

async func_namereq: Request, res: Response, next: NextFunction) {
  const {uno} = req.member;
  
  //todo
   *........
  //
  
  
}

좋은 웹페이지 즐겨찾기