Cannot query field no GraphQL do Magento 2: o campo existe e some

A query volta com Cannot query field "meu_campo" on type "ProductInterface" e o campo está lá, escrito no schema.graphqls do seu módulo. Em nove de cada dez vezes o schema não tem culpa: é cache. O Magento costura os arquivos de todos os módulos uma vez, guarda o resultado, e enquanto a versão velha estiver de pé aquele campo simplesmente não existe para o servidor.

A limpeza que resolve

cd /var/www/loja
sudo -u www-data rm -rf generated/code generated/metadata
sudo -u www-data bin/magento setup:upgrade
sudo -u www-data bin/magento setup:di:compile
sudo -u www-data bin/magento cache:flush

Duas ressalvas antes de colar isso em produção. A loja fica fora do ar entre o rm -rf generated/ e o fim do setup:di:compile, então rode em janela de manutenção. E o cache:clean config sozinho não adianta: o schema costurado é gravado com o id Magento_Framework_GraphQlSchemaStitching_Config_Data e sem a tag CONFIG, e o cache:clean apaga por tag. Quem derruba é o cache:flush, que esvazia o storage inteiro. Apagar var/cache na unha também só resolve se o backend for arquivo; com Redis não tem nada ali.

Confirme o que o servidor carregou

Em vez de adivinhar, pergunte ao próprio endpoint quais campos o tipo tem hoje:

curl -s https://sualoja.com.br/graphql 
  -H 'Content-Type: application/json' 
  -d '{"query":"{ __type(name: "ProductInterface") { fields { name } } }"}'

Se a resposta for GraphQL introspection is not allowed, o bloqueio é o graphql/disable_introspection do app/etc/env.php; em produção ele fica ligado mesmo, faça o teste em homologação. Campo fora da lista é problema no servidor: o arquivo precisa estar em app/code/Vendor/Modulo/etc/schema.graphqls, e não em etc/frontend/, porque o leitor de schema roda no escopo global e não olha em subpasta de área. Depois disso, confira se o módulo está ligado com bin/magento module:status Vendor_Modulo.

Última pegadinha: consulta GraphQL por GET entra no full page cache. Depois de mexer no schema, teste com POST, senão você vai debugar meia hora uma resposta que ficou congelada.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *