본문 바로가기

IT/JavaScript

Request body validation middleware

회사에서 FrontEnd 뿐만 아니라 BackEnd 작업도 많이 한다,

지금도 Node.js기반 백엔드 작업을 굉장히 많이 하고 있는데 하면서 느낀점 및 꿀팁들을 작성해 보고자 한다.

언어가 JavaScript인 만큼 넘어온 요청 Body값이 Number인지 String인지 구분도 못하고 그냥 넘겨주는 것이 너무 불편하고 보기 껄끄러워서 Midleware를 활용하여 Request body 검증 로직을 수행하도록 했다.

그냥 Type검사 안하고 바로 통과해 버리는 JavaScript 보면 매우 불편해서 참을 수가 없다.

이게 회사 뿐만이 아니라 현재 진행하고 있는 Side project에도 적용을 해봤는데 매우 좋은 것 같다.

회사 로직을 옮겨 적을 수 없으니 Side project에서 진행한 Middleware로직을 간소화 하여 소개하도록 하겠다.

Joi

바로 본론에 들어가기에 앞서 예전에 React hook form을 공부했을 때 Joi 라는 라이브러리를 알게 됐는데 이게 꽤 유용하고 만족스러웠다.

npm 다운로드 수 역시 어마무시하게 많고 꾸준히 업데이트 해주고 있으니 믿고 사용해도 무방할 듯 하다.

나는 Client에서 넘겨준 Request body값을 검증하기 위해 Joi를 활용해 임시 Model을 작성했다.

ex)

// 대충 modelHelper라는 Object
const modelHelper = {
    post: {
        title: Joi.string().required(),
    },
};

// 대충 joi object로 바꾸는 함수
modelHelper.toSchema = function (target) {
    if(typeof target !== "string") throw new Error("String 아니면 object의 키 접근 못함 ㅋ");
      const schema = Joi.object(modelHelper[target]);
      return schema;
}
  • 위의 예시처럼 model helper라는 object를 만들고 여기에 내가 검증할 body의 키 값들을 정의
  • Joi의 검증을 수행하려면 Joi의 object schema를 만들어야 하므모 toSchema 함수 정의

약간 위의 느낌으로다가 model helper를 작성했다.

핵심은 toSchema함수의 Parameter target 값이다. Middleware는 함수의 레퍼런스를 전달하므로 Parameter를 전달할 수 없는데 target 값을 전달하기 위해 느낌적인 느낌으로 클로저를 활용해 Middleware를 작성하도록 한다.

ex)

function validation(target) {
    return function(req, res, next) {
        const body = req.body;
          const { error } = modelHelper
            .toSchema(target)
            .validate(body);
          if(error) {
            res.status(400).send({ message: "Request body error !" });
        }
          next();
    }
}
  • Joi를 활용해 생성한 Schema를 Client에게 받은 body 값과 비교 검증 수행

이후 router에서 이 미들웨어를 중간에 잘 넣어주면 된다.

ex)

router.post("/post", validation("post"), // 대충 컨트롤러);

'IT > JavaScript' 카테고리의 다른 글

JavaScript Functional Programming [ pipe ]  (0) 2023.06.07
if를 통한 명확하고 확실한 조건 처리  (0) 2023.04.14
Object, Array each 함수  (0) 2023.03.28
TypeScript 타입 단언  (0) 2023.02.21
TypeScript 타입 추론  (0) 2023.01.08