Тут вроде бы нет стандарта, но мне нравится следующий подход:
1. Ошибки валидации в мутациях возвращаются внутри data, так как это не ошибки, а просто отклонение от “golden flow” и их можно показать пользователю (“email не может быть пустым“)
2. Настоящие ошибки (токен протух, нет прав, …) возвращаются в errors и обрабатываются, но не показываются явно (например, если токен протух – выкидываем пользователя на экран логина)
мне тоже кажется это логичным, но просто у apollo-server'а, например, есть такой типа middleware —
formatError
, в котором можно эти ошибки обработать в одном месте. а так получается мне нужно будет их обрабатывать в каждом резолвере.
поясню на примере:
допустим, у меня мутация по созданию юзера. у юзера должен быть указан либо email, либо телефон. насколько я понимаю, системой типов в graphql это нельзя описать, поэтому этой проверкой занимается mongoose.
я делаю:
let user = new User(args.input)
await user.save()
если там произошла ошибка валидации (не указан ни емэйл, ни телефон), оно выкинется в
formatError
,
где я могу это централизованно обработать.
с другой стороны, если засовывать это в payload (что мне тоже больше нравится концептуально), нужно в каждом резолвере делать что-то типа:
let user = new User(args.input)
try {
await user.save()
} catch (err) {
// тут разные проверки err
return {
success: false,
errors: somehowFormatErrors(err)
}
}