Как диагностировать в Laravel lighthouse GraphQL ошибки при определении пагинации?

Ссылка скопирована
1 ответ

По вводным: есть такой код на GraphQl на сервере:

type LabelPrinter { id: ID! title: String! ip: String! port: Int! shop_id: ID! shop: Shop @belongsTo } type LabelPrinterPaginator { data: [LabelPrinter!]! paginatorInfo: PaginatorInfo! } extend type Query { labelPrinters( first: Int, page: Int ): LabelPrinterPaginator @paginate( type: PAGINATOR, model: "App\\Models\\LabelPrinter", defaultCount: 50, maxCount: 50 ) labelPrinter(id: ID! @eq): LabelPrinter @find(model: "App\\Models\\LabelPrinter") }

При запросе с фронта:

query { labelPrinters(first: 50, page: 1) { data { id title } } }

Ошибки типа:

"message": "Cannot query field \"id\" on type \"LabelPrinterPaginator\".",

При выполненииphp artisan lighthouse:print-schemaПо вводным: выяснилось, что GraphQl сам создает тип:

"""A paginated list of LabelPrinterPaginator items.""" type LabelPrinterPaginatorPaginator { """Pagination information about the list of items.""" paginatorInfo: PaginatorInfo! """A list of LabelPrinterPaginator items.""" data: [LabelPrinterPaginator!]! }

По вводным: и присваивает его функции labelPrinters:

labelPrinters( """Limits number of fetched items. Maximum allowed value: 50.""" first: Int = 50 """The offset from which items are returned.""" page: Int ): LabelPrinterPaginatorPaginator

Сейчас ситуация такая: поэтому и ошибка с фронта такая, как указал выше.

Что именно с этим можно сделать?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Ошибки пагинации в Laravel Lighthouse GraphQL чаще всего связаны с неправильным типом возвращаемого значения, неверной директивой pagination или конфликтом между Eloquent Builder, Collection и Paginator. Lighthouse ожидает, что поле с пагинацией вернет builder/query, а не уже готовую коллекцию, если используется стандартная директива.

Проверьте schema. Для типового списка лучше использовать директиву @paginate:

type Query {
  users: [User!]! @paginate(defaultCount: 20)
}

type Query { users: [User!]! @paginate(defaultCount: 20) }

Если используете resolver, он должен возвращать Query Builder, а не User::all():

public function users($_, array $args)
{
    return User::query()
        ->where('active', true)
        ->orderByDesc('id');
}

public function users($_, array $args) { return User::query() ->where('active', true) ->orderByDesc('id'); }

Плохой вариант для стандартной пагинации:

return User::all(); // это Collection, а не Builder

return User::all(); // это Collection, а не Builder

Также проверьте, какой тип пагинации включен: paginator, connection или simple. Если фронт ожидает edges/pageInfo, а схема возвращает paginatorInfo/data, будет казаться, что пагинация «не работает», хотя запрос просто написан под другой формат.

  • очистите кэш схемы Lighthouse после изменений;
  • проверьте, что аргументы page/first/count соответствуют типу пагинации;
  • не вызывайте get() до передачи результата в Lighthouse;
  • для сложных фильтров используйте scopes или builder;
  • смотрите полный текст GraphQL errors, а не только сообщение на фронте.

После правки выполните минимальный запрос в GraphQL Playground/Altair. Если ответ содержит paginatorInfo и data, backend работает. Если ошибка остается, смотрите stack trace в Laravel log: там обычно видно, что именно вернул resolver и какой тип ожидал Lighthouse.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно