Это мой опыт о проверке данных запроса с помощью валидатора 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']
}),
})
),
}),
})
И вот как я получил параметры, аналогичные тому, как они были представлены.
Читатели, дайте мне знать, если вы видите какой-либо другой способ решения этой проблемы.
Спасибо, что прочитали.