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 в 2 частях, request.all() и request.allFiles(). Таким образом, данные будут следующими

request.all() : { "users": [ { "name": "John Doe" } ] }
request.allFiles(): { "users": [ { "avatar": <File> } ] }
Войти в полноэкранный режим Выйти из полноэкранного режима

И чтобы запустить валидацию, эти части данных нужно объединить, чтобы убедиться, что они проходят правила.
К сожалению, по задумке автора AdonisJS, глубокое слияние повлияет на производительность фреймворка. Поэтому для их объединения используется неглубокое слияние, которое выглядит следующим образом

data = {
  ...body,
  ...files,
}
Вход в полноэкранный режим Выход из полноэкранного режима

И вы знаете, что произошло. После слияния пользовательский элемент имеет только свойство avatar.

Решение

В соответствии с предложением автора в комментарии, я изменил способ проверки данных, выполнив глубокое слияние данных с помощью lodash merge и используя автономный валидатор 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']
        }),
      })
    ),
  }),
})
Вход в полноэкранный режим Выйти из полноэкранного режима

И вот как я получил параметры, аналогичные тому, как они были представлены.

Читатели, дайте мне знать, если вы видите какой-либо другой способ решения этой проблемы.

Спасибо, что прочитали.

Оцените статью
devanswers.ru
Добавить комментарий