개체의 AdonisJS 유효성 검사 파일

이것은 AdonisJS 유효성 검사기와 이에 대한 솔루션을 사용하여 요청 데이터 유효성 검사에 대한 제 경험입니다. 이 문제에 대한 기사를 쉽게 찾을 수 없어서 같은 문제를 가진 다른 사람들이 해결책을 더 쉽게 찾을 수 있도록 이 글을 쓰기로 결정했습니다.

문맥



이 문제는 처리를 위해 백엔드에 제출해야 하는 데이터 블록이 있을 때 발생했습니다. 형식은 다음과 같습니다.

{
  "users": [
    {
      "name": "John Doe",
      "avatar": <File>
    },
    ...
  ]
}


그리고 AdonisJS의 문서에 따라 이 스니펫을 사용하여 데이터의 유효성을 검사합니다.

params = await request.validate({
  schema: schema.create({
    users: schema.array().members(
      schema.object().members({
        name: schema.string({ trim: true }),
        avatar: schema.file({
          size: '10mb',
          extnames: ['jpg', 'heic']
        }),
      })
    ),
  }),
})


문제



문제는 백엔드에 제출된 데이터가 AdonisJS에 의해 request.all()request.allFiles() 두 부분으로 저장된다는 것입니다. 따라서 데이터는

request.all() : { "users": [ { "name": "John Doe" } ] }
request.allFiles(): { "users": [ { "avatar": <File> } ] }


유효성 검사를 실행하려면 이러한 데이터 조각을 병합하여 규칙을 통과하는지 확인해야 합니다.
유감스럽게도 다음AdonisJS's author idea의 심층 병합은 프레임워크의 성능에 영향을 미칩니다. 따라서 얕은 병합을 사용하여 결합하고 다음과 같이 보입니다.

data = {
  ...body,
  ...files,
}


그리고 당신은 무슨 일이 일어 났는지 압니다. 병합 후 사용자 항목에는 아바타 속성만 있습니다.

해결책



에 대한 의견의 작성자 제안으로 lodash 병합을 사용하여 심층 병합 데이터를 수행하고 병합된 데이터의 유효성을 검사하기 위해 AdonisJS 독립 실행형 유효성 검사기를 사용하여 데이터 유효성 검사 방법을 변경했습니다.

import lodashMerge from 'lodash/merge'
import { validator } from '@ioc:Adonis/Core/Validator'
...
allData = lodashMerge({}, request.all(), request.allFiles())

params = await validator.validate({
  data: allData,
  schema: schema.create({
    users: schema.array().members(
      schema.object().members({
        name: schema.string({ trim: true }),
        avatar: schema.file({
          size: '10mb',
          extnames: ['jpg', 'heic']
        }),
      })
    ),
  }),
})


이것이 제출된 방식과 동일한 매개변수를 얻은 방법입니다.

독자 여러분, 이 문제를 해결할 다른 방법이 있으면 알려주십시오.

읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기