Express를 활용하여 server 프로그램을 만들다보면 세션관리와 같은 일에서 미드웨어로 처리하고 Request에 새로운 Object값을 추가로 넣어줘야하는 경우가 발생합니다.
아래의 방법을 순차적으로 따른다.
전달하고자하는 자료형을 미리 정의해준다.
(경로는 자유롭게 해도 상관없지만 위의 경로를 추천한다.)
interface로 선언, type로 선언하게 되면 Request에 전달할수가 없습니다.
export interface Member {
uno?: number; uid?:string; uname? : string;
unick?:string, camp_style?:string;
profile_img?: string;
}
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;
}
}
}
이제 미들웨어에서 사용하여 추가하면 된다. 쿼리로부터 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();
}
middleware를 express에 추가하고 나면 아래와 같이 해당 object에 접근이 가능하다.
예제에서는 member이다.
async func_namereq: Request, res: Response, next: NextFunction) {
const {uno} = req.member;
//todo
*........
//
}