Apollo-link-rest: "TypeError: encaminhar não é uma função"

Criado em 14 nov. 2018  ·  19Comentários  ·  Fonte: apollographql/apollo-link-rest

Hiya,

Tenho encontrado o mesmo erro toda vez que usei apollo-link-rest: abrir o GraphiQL nas ferramentas de desenvolvimento do Apollo sempre mostra um erro "TypeError: encaminhar não é uma função". O texto completo do erro:

{ "errors": [ { "message": "forward is not a function", "locations": [ "TypeError: forward is not a function\n at RestLink../node_modules/apollo-link-rest/bundle.umd.js.RestLink.request (http://localhost:3000/static/js/bundle.js:5566:24)\n at http://localhost:3000/static/js/bundle.js:5746:33\n at ApolloLink.request (http://localhost:3000/static/js/bundle.js:2602:20)\n at ApolloLink.request (http://localhost:3000/static/js/bundle.js:5745:31)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at e.request (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38654)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at e.request (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38421)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38085\n at new s (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:4855)\n at l.subscribe (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:6185)\n at n.<anonymous> (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38914)\n at n.t.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:52786)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:19519\n at n (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:36148)" ] } ] }

Consultas e mutações com a diretiva @rest parecem estar funcionando bem e não @client não funciona e lança o mesmo erro (como a carga útil do erro em umcomponente de react-apollo).

Clonei os três projetos de exemplo react-apollo (simples, avançado, datilografado) e o mesmo erro apareceu em todos os três. # 121 faz referência a esse problema, mas não parece haver uma solução; a correção incluída é para um bug separado "falha ao buscar". Há também uma menção de uma directiva faltando @rest ou @client como uma causa potencial, mas como mencionado isso está acontecendo com os projetos de amostra, bem como o meu próprio, então eu não acho que uma directiva que falta é o culpado.

Para reproduzir, basta clonar os projetos de exemplo, instalar, iniciar e abrir as ferramentas de desenvolvimento do Apollo no Chrome (a versão atual em que estou tendo este erro é 70.0.3538.77).

Obrigado por olhar para isso, adorei o pacote e ache-o incrivelmente útil!

bug 🐛 enhancement💡 has-reproduction help wanted 🛠 question❔

Comentários muito úteis

Oi! Consegui descobrir um pouco o que está causando esse problema.
Parece que essa operação foi chamada pelo apollo-client-devtools.

Quando chega aqui , entretanto, forward é indefinido.

Não tenho certeza de como tudo isso funciona, caso contrário, faria um PR para corrigir o problema. Quando mudei o cheque !isRestQuery para !isRestQuery && forward fui capaz de silenciar o erro acima. No entanto, recebi um novo erro:

Error: Type Query must define one or more fields.
    at t.assertValidSchema (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:258433)
    at O (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:272246)
    at k (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:271277)
    at t.execute (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:270565)
    at t.v (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:806774)
    at t.n.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:394893)
    at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:517657

Aqui está um aplicativo de exemplo que usei para ver / depurar esse problema: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

Obrigado por todo o seu trabalho nesta biblioteca. Se eu puder ajudar de alguma forma, fico feliz em fazê-lo.

Todos 19 comentários

Eu não acho que GraphIQL suporte apollo-link-state / apollo-link-rest - eu não acho que eles suportam links em geral. Você tem exemplos disso funcionando?

Claro, o GraphiQL nas ferramentas de desenvolvimento do Apollo parece funcionar. Usando a API JSONPlaceholder , RestLink uri definido como https://jsonplaceholder.typicode.com - aqui está o que recebo inicialmente antes de qualquer consulta ser executada:

apollo-devtools-initial

depois de executar a consulta para obter todos os usuários:

apollo-devtools-users

ou com o projeto de exemplo "simples":

apollo-devtools-simple

Outra coisa que notei é que a opção "ler do cache" não funciona com novas entradas criadas com a API JSONPlaceholder; uma mutação POST grava uma nova entrada no cache de maneira adequada, mas uma consulta subsequente tenta consultar remotamente, mesmo com "ler do cache" selecionado. Como a nova entrada não foi realmente criada, ele retorna nulo do ponto de extremidade remoto conforme o esperado, mas é criado no cache, portanto, "ler do cache" deve retorná-lo? Isso provavelmente é agnóstico para apollo-link-rest e está fora do escopo desta edição, mas ainda é interessante.

Estou recebendo o mesmo erro no GraphiQL, forward is not a function . Porém, tudo além de cache parece estar funcionando.

Quaisquer atualizações sobre esse pessoal, eu tive o mesmo problema :(

@cstoddart Seu painel de cache está vazio, correto?

Alguém sabe como visualizar o cache sem os devtools?

Estou experimentando a mesma coisa. @cgatian sim, meu painel de cache está vazio.

É difícil aceitar a cadeia de ferramentas de Apollo quando essas quebras ocorrem por tanto tempo. O apollo-link-rest ainda está sendo trabalhado ativamente?

@heymanhn - Sim, o ApolloLinkRest está sendo desenvolvido ativamente. Mas isso é código aberto. Fico feliz em ajudá-lo a testar e entregar um PR, mas não tenho experiência com ApolloDevTools.

Precisamos de alguém que faça ou esteja disposto a mergulhar em sua base de código para descobrir o que é necessário para ser compatível com ela. Eu desafio você a descobrir o que está faltando e eu adoraria apoiar suas contribuições!

Quero deixar claro que não sei se apollo-link-rest funcionou com ApolloDevTools, então eu diria que isso é menos uma falha e mais um recurso desejado ausente .

Além disso, eu pessoalmente uso apollo-link-rest com React-Native, e há um ano atrás, ApolloDevTools não era compatível com React-Native.

Desde então, eles anunciaram que consertaram isso, mas não consegui ativar o ApolloDevTools para o projeto de reação nativa da minha equipe, então não sei o que há de errado aí.

Oi! Consegui descobrir um pouco o que está causando esse problema.
Parece que essa operação foi chamada pelo apollo-client-devtools.

Quando chega aqui , entretanto, forward é indefinido.

Não tenho certeza de como tudo isso funciona, caso contrário, faria um PR para corrigir o problema. Quando mudei o cheque !isRestQuery para !isRestQuery && forward fui capaz de silenciar o erro acima. No entanto, recebi um novo erro:

Error: Type Query must define one or more fields.
    at t.assertValidSchema (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:258433)
    at O (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:272246)
    at k (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:271277)
    at t.execute (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:270565)
    at t.v (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:806774)
    at t.n.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:394893)
    at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:517657

Aqui está um aplicativo de exemplo que usei para ver / depurar esse problema: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

Obrigado por todo o seu trabalho nesta biblioteca. Se eu puder ajudar de alguma forma, fico feliz em fazê-lo.

Estou me deparando com isso recentemente e reduzi o erro. É o meu caso para o IntrospectionQuery, que acredito que o Graphiql / devtools está consultando o servidor Graphql para o esquema? O problema é que estou usando apenas apollo-client e apollo-link-rest, então não há um servidor ou esquema, exceto para o esquema de cache (se houver). Por sua vez, meus devtools apollo estão em branco. Não tenho certeza de qual seria a correção aqui, tudo funcionou em um ponto.

Estou me deparando com isso recentemente e reduzi o erro. É o meu caso para o IntrospectionQuery, que acredito que o Graphiql / devtools está consultando o servidor Graphql para o esquema? O problema é que estou usando apenas apollo-client e apollo-link-rest, então não há um servidor ou esquema, exceto para o esquema de cache (se houver). Por sua vez, meus devtools apollo estão em branco. Não tenho certeza de qual seria a correção aqui, tudo funcionou em um ponto.

Mesmo aqui

Vimos ApolloDevTools trabalhando com apollo-link-state, apollo-link-Rest no React Native Debugger, recentemente na última quinta-feira. Temos certeza de que este ainda é um problema ativo? Em quais versões você está @edgars-sirokovs?

Vimos ApolloDevTools trabalhando com apollo-link-state, apollo-link-Rest no React Native Debugger, recentemente na última quinta-feira. Temos certeza de que este ainda é um problema ativo? Em quais versões você está @edgars-sirokovs?

@fbartho 2.2.4

@fbartho acabou de verificar novamente - está meio que funcionando agora. Pelo menos não está mais em branco.
Ainda tenho problemas - não ser capaz de rolar a visualização do cache e o Explorador de documentação não está mostrando o esquema (tenho apenas o esquema do lado do cliente transmitido por meio de typeDefs ).

Eu não sei o que o explorador de documentação precisa para suportar o apollo-link-rest, mas não me surpreenderia se houver trabalho a fazer e / ou se nunca funcionará bem. Aceitando PRs se o trabalho for necessário aqui!

Rolar a visualização do cache definitivamente parece um bug no código do ApolloDevTools,

Mas estou feliz que você tenha feito progressos @edgars-sirokovs!

Vimos ApolloDevTools trabalhando com apollo-link-state, apollo-link-Rest no React Native Debugger, recentemente na última quinta-feira. Temos certeza de que este ainda é um problema ativo? Em quais versões você está @edgars-sirokovs?

Eu o testo com o projeto simple e não funciona, a guia Apollo DevTools está disponível, mas está sempre em branco e estou recebendo o próximo erro. https://github.com/apollographql/apollo-link-rest/tree/master/examples/simple

@fbartho Fiz o mesmo com o projeto em que estou trabalhando no react native com react-native-debugger e tive o mesmo problema. Você poderia compartilhar sua configuração ou quais versões você estava usando?

Aprendemos hoje que funciona - mas não a guia GraphiQL, apenas as outras guias: https://github.com/apollographql/apollo-client-devtools/issues/227

Devido ao que parece ser o mesmo problema, não consigo ler o esquema local Docs no Devtools GraphiQL.

A execução desta consulta de introspecção exibe [object Object] no painel de resposta e os relatórios do console [Network error]: TypeError: forward is not a function

{
  __schema {
    types {
      name
    }
  }
}

Meu cliente não tem servidor Graphql:

import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { persistCache } from 'apollo-cache-persist';
import localForage from 'localforage';
import typeDefs from './schema.graphql';
import { resolvers } from './resolvers';
import { link } from './link';
import { initialState } from './initialState';
export let client;
export async function createApolloClient() {
  const cache = new InMemoryCache();
  await persistCache({ cache, storage: localForage, serialize: false });
  client = new ApolloClient({ cache, link, resolvers, typeDefs });
  window.__APOLLO_CLIENT__ = client;
  cache.writeData({ data: initialState });
  return client;
}

Veja https://spectrum.chat/apollo/apollo-link-state/client-has-typedefs-but-no-docs-in-graphiql~8a80e439-3257-4fce-a666-a1e75c3cec63

Não tenho certeza se isso está exatamente relacionado ao caso de uso como todos acima, mas este é o único resultado de pesquisa relevante que consegui encontrar com o erro que estava recebendo e que eventualmente resolvi.

Recentemente, encontrei este erro quando estava tentando adicionar apollo-link-rest a um aplicativo existente usando @apollo/client .

tl; dr O problema acabou sendo que você não pode passar uri e link como parâmetros de opção ao definir um novo ApolloCient . Em vez disso, você deve remover o parâmetro uri e criar um HttpLink usando createHttpLink e, em seguida, usar from() para combinar seus links e eles ao link parâmetro de opção.

Antes de adicionar o link restante, esta é a aparência da minha definição:

import { ApolloClient, InMemoryCache } from '@apollo/client';

const client = new ApolloClient({
  uri: '/api/graphql',
  cache: new InMemoryCache(),
});

Ao ler a documentação, fiquei com a impressão de que deveria ser capaz de adicionar um link de descanso definindo um novo RestLink e adicionando o parâmetro link às minhas opções como este:

import { ApolloClient, InMemoryCache } from '@apollo/client';
import { RestLink } from 'apollo-link-rest';

const restLink = new RestLink({
  uri: '/api',
});

const client = new ApolloClient({
  uri: '/api/graphql',
  cache: new InMemoryCache(),
  link: restLink,
});

No entanto, essa configuração fez com que o erro TypeError: forward is not a function ocorresse e o cliente não funcionasse mais.

Depois de ler mais na documentação sobre links, percebi (embora não pudesse ver explicitamente dito, e pode haver casos em que isso esteja incorreto) que você não pode usar uri e link parâmetros de opção na definição ApolloClient ao mesmo tempo. Usando essa nova informação, consegui corrigir o problema removendo o parâmetro uri e criando um HttpLink que combinei com RestLink usando from() e tudo finalmente funcionou (observe que, de acordo com a documentação , RestLink deve ir antes de HttpLink ):

import {
  ApolloClient, InMemoryCache, from, createHttpLink,
} from '@apollo/client';
import { RestLink } from 'apollo-link-rest';
const httpLink = createHttpLink({
  uri: '/api/graphql',
});

const restLink = new RestLink({
  uri: '/api',
});

const client = new ApolloClient({
  cache: new InMemoryCache(),
  link: from([restLink, httpLink]),
});

obrigado @crbanman você salvou meu dia! 💯

Esta página foi útil?
0 / 5 - 0 avaliações