Apollo-link-rest: "TypeError: forward n'est pas une fonction"

Créé le 14 nov. 2018  ·  19Commentaires  ·  Source: apollographql/apollo-link-rest

Hiya,

J'ai rencontré la même erreur à chaque fois que j'ai utilisé apollo-link-rest: l'ouverture de GraphiQL dans les outils de développement Apollo affiche toujours une erreur "TypeError: forward is not a function". Le texte intégral de l'erreur:

{ "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)" ] } ] }

Les requêtes et mutations avec la directive @rest semblent fonctionner génèrent aucune autre erreur, ce n'est donc pas un problème complètement bloquant, mais cela affecte potentiellement certaines autres fonctionnalités d'Apollo Client, par exemple essayer d'utiliser la directive @client ne fonctionne pas et renvoie la même erreur (comme la charge utile d'erreur dans uncomposant de react-apollo).

J'ai cloné les trois exemples de projets react-apollo (simples, avancés, dactylographiés) et la même erreur apparaît dans les trois. # 121 fait référence à ce problème mais il ne semble pas y avoir de correctif; le correctif qui est inclus est pour un bogue distinct "échec de récupération". Il y a aussi une mention d'une directive @rest ou @client manquante comme cause potentielle, mais comme mentionné, cela se produit avec les exemples de projets ainsi que le mien, donc je ne pense pas qu'une directive manquante soit le coupable.

Pour reproduire, clonez simplement les exemples de projets, installez et démarrez et ouvrez les outils de développement Apollo dans Chrome (la version actuelle dans laquelle j'ai cette erreur est 70.0.3538.77).

Merci d'avoir regardé cela, adorez le package et trouvez-le incroyablement utile!

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

Commentaire le plus utile

Salut! J'ai pu examiner un peu ce qui cause ce problème.
Il semble que cette opération soit appelée par apollo-client-devtools.

Quand il est ici cependant, forward est non défini.

Je ne suis pas tout à fait sûr de savoir comment tout cela fonctionne sinon je ferais un PR pour résoudre le problème. Lorsque j'ai changé le !isRestQuery en !isRestQuery && forward j'ai pu faire taire l'erreur ci-dessus. Cependant, j'ai une nouvelle erreur:

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

Voici un exemple d'application que j'ai utilisé pour voir / déboguer ce problème: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

Merci pour tout votre travail sur cette bibliothèque. Si je peux aider de quelque manière que ce soit, je suis heureux de le faire.

Tous les 19 commentaires

Je ne pense pas que GraphIQL prend en charge apollo-link-state / apollo-link-rest - je ne pense pas qu'ils prennent en charge les liens en général. En avez-vous des exemples?

Bien sûr, GraphiQL dans les outils de développement Apollo semble fonctionner. En utilisant l' API JSONPlaceholder , l'URI RestLink est défini sur https://jsonplaceholder.typicode.com - voici ce que j'obtiens au départ avant l'exécution de toute requête:

apollo-devtools-initial

après avoir exécuté la requête pour obtenir tous les utilisateurs:

apollo-devtools-users

ou avec l'exemple de projet "simple":

apollo-devtools-simple

Une autre chose que j'ai remarqué est que l'option "lire depuis le cache" ne fonctionne pas avec les nouvelles entrées créées avec l'API JSONPlaceholder; une mutation POST écrit correctement une nouvelle entrée dans le cache, mais une requête ultérieure tente d'interroger à distance même avec "lire à partir du cache" sélectionné. Comme la nouvelle entrée n'est pas réellement créée, cela retourne null du point de terminaison distant comme prévu, mais il est créé dans le cache, donc "lire à partir du cache" devrait le renvoyer? Ceci est probablement indépendant de apollo-link-rest, et sort du cadre de ce numéro, mais toujours intéressant.

J'obtiens la même erreur dans GraphiQL, forward is not a function . Tout sauf cache semble cependant fonctionner.

Toutes les mises à jour sur ce gars, j'ai eu le même problème :(

@cstoddart Votre panneau de cache est vide, n'est-ce pas?

Est-ce que quelqu'un sait comment afficher le cache sans les outils de développement?

Je vis la même chose. @cgatian oui, mon panneau de cache est vide.

Il est difficile d'adopter la chaîne d'outils d'Apollon lorsque ces ruptures se produisent pendant si longtemps. Est-ce que apollo-link-rest est toujours activement travaillé?

@heymanhn - Oui, ApolloLinkRest est activement développé. Mais c'est open source. Je suis heureux de vous aider à faire tester et livrer un PR, mais je n'ai pas d'expérience avec ApolloDevTools.

Nous avons besoin de quelqu'un qui le fasse ou qui soit prêt à plonger dans leur base de code pour déterminer ce qui est nécessaire pour être compatible avec celui-ci. Je vous mets au défi de découvrir ce qui manque et j'aimerais soutenir vos contributions!

Je veux être clair, que je ne sais pas qu'apollo-link-rest a déjà fonctionné avec ApolloDevTools, donc je dirais que c'est moins une rupture, et plus une fonctionnalité souhaitée manquante .

De plus, j'utilise personnellement apollo-link-rest avec React-Native, et il y a un an, ApolloDevTools n'était pas compatible avec React-Native.

Ils ont depuis annoncé qu'ils avaient corrigé cela, mais je n'ai pas été en mesure d'activer ApolloDevTools pour le projet de réaction native de mon équipe, donc je ne sais pas ce qui ne va pas.

Salut! J'ai pu examiner un peu ce qui cause ce problème.
Il semble que cette opération soit appelée par apollo-client-devtools.

Quand il est ici cependant, forward est non défini.

Je ne suis pas tout à fait sûr de savoir comment tout cela fonctionne sinon je ferais un PR pour résoudre le problème. Lorsque j'ai changé le !isRestQuery en !isRestQuery && forward j'ai pu faire taire l'erreur ci-dessus. Cependant, j'ai une nouvelle erreur:

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

Voici un exemple d'application que j'ai utilisé pour voir / déboguer ce problème: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

Merci pour tout votre travail sur cette bibliothèque. Si je peux aider de quelque manière que ce soit, je suis heureux de le faire.

Je suis confronté à cela récemment et j'ai réduit l'erreur dans mon cas à IntrospectionQuery, qui est, je crois, graphiql / devtools interrogeant le serveur graphql pour le schéma? Le problème est que j'utilise uniquement apollo-client et apollo-link-rest, donc il n'y a pas de serveur ou de schéma, à l'exception du schéma de cache (s'il y en a un). À son tour, mes outils de développement apollo sont vides. Je ne sais pas exactement quelle serait la solution ici, tout a fonctionné à un moment donné.

Je suis confronté à cela récemment et j'ai réduit l'erreur dans mon cas à IntrospectionQuery, qui est, je crois, graphiql / devtools interrogeant le serveur graphql pour le schéma? Le problème est que j'utilise uniquement apollo-client et apollo-link-rest, donc il n'y a pas de serveur ou de schéma, à l'exception du schéma de cache (s'il y en a un). À son tour, mes outils de développement apollo sont vides. Je ne sais pas exactement quelle serait la solution ici, tout a fonctionné à un moment donné.

Pareil ici

Nous avons vu ApolloDevTools travailler avec apollo-link-state, apollo-link-Rest dans React Native Debugger, pas plus tard que jeudi dernier. Sommes-nous sûrs qu'il s'agit toujours d'un problème actif? Quelles versions êtes-vous sur @ edgars-sirokovs?

Nous avons vu ApolloDevTools travailler avec apollo-link-state, apollo-link-Rest dans React Native Debugger, pas plus tard que jeudi dernier. Sommes-nous sûrs qu'il s'agit toujours d'un problème actif? Quelles versions êtes-vous sur @ edgars-sirokovs?

@fbartho 2.2.4

@fbartho vient de vérifier à nouveau - cela fonctionne un peu maintenant. Au moins plus vide.
J'ai toujours des problèmes - ne pas pouvoir faire défiler la vue du cache et l'explorateur de documentation n'affiche pas le schéma (je n'ai que le schéma côté client transmis via typeDefs ).

Je ne sais pas ce dont l'explorateur de documentation a besoin pour prendre en charge apollo-link-rest mais cela ne me surprendrait pas s'il y a du travail à faire, et / ou cela ne fonctionnera jamais bien. Accepter les RP si du travail est nécessaire ici!

Faire défiler la vue du cache semble définitivement être un bogue dans le code ApolloDevTools,

Mais je suis content que vous ayez progressé @ edgars-sirokovs!

Nous avons vu ApolloDevTools travailler avec apollo-link-state, apollo-link-Rest dans React Native Debugger, pas plus tard que jeudi dernier. Sommes-nous sûrs qu'il s'agit toujours d'un problème actif? Quelles versions êtes-vous sur @ edgars-sirokovs?

Je le teste avec le projet simple et cela ne fonctionne pas, l'onglet Apollo DevTools est disponible mais il est toujours vide et j'obtiens l'erreur suivante. https://github.com/apollographql/apollo-link-rest/tree/master/examples/simple

@fbartho J'ai fait la même chose avec le projet sur travaille React native avec react-native-debugger et j'ai eu le même problème. Pourriez-vous partager votre configuration ou quelles versions utilisiez-vous?

Nous avons appris aujourd'hui que cela fonctionne - mais pas l'onglet GraphiQL, seulement les autres onglets: https://github.com/apollographql/apollo-client-devtools/issues/227

En raison de ce qui semble être ce même problème, je ne parviens pas à lire le schéma local Docs dans devtools GraphiQL.

L'exécution de cette requête d'introspection affiche [object Object] dans le panneau de réponse et la console rapporte [Network error]: TypeError: forward is not a function

{
  __schema {
    types {
      name
    }
  }
}

Mon client n'a pas de serveur 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;
}

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

Je ne sais pas si cela est exactement lié au cas d'utilisation comme tout le monde ci-dessus, mais c'est le seul résultat de recherche pertinent que j'ai pu trouver avec l'erreur que j'obtenais que j'ai finalement résolue.

J'ai récemment rencontré cette erreur lorsque j'essayais d'ajouter apollo-link-rest à une application existante en utilisant @apollo/client .

tl; dr Le problème s'est avéré être que vous ne pouvez pas passer à la fois uri et link comme paramètres d'option lors de la définition d'un nouveau ApolloCient . Au lieu de cela, vous devez supprimer le paramètre uri et créer un HttpLink utilisant createHttpLink , puis utiliser from() pour combiner vos liens et eux vers le link paramètre d'option.

Avant d'ajouter le lien de repos, voici à quoi ressemblait ma définition:

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

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

En lisant la documentation, j'avais l'impression que je devrais pouvoir ajouter un lien de repos en définissant un nouveau RestLink et en ajoutant le paramètre supplémentaire link à mes options comme ceci:

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,
});

Cependant, cette configuration provoquait l'erreur TypeError: forward is not a function et le client ne fonctionnait plus.

Après avoir lu plus loin dans la documentation sur les liens, j'ai réalisé (bien que je ne puisse pas le voir explicitement dit, et il peut y avoir des cas où cela est incorrect) que vous ne pouvez pas utiliser les uri et link paramètres d'option dans la définition ApolloClient en même temps. En utilisant ces nouvelles informations, j'ai pu résoudre le problème en supprimant le paramètre uri et en créant un HttpLink que j'ai ensuite combiné avec RestLink utilisant from() et tout a finalement fonctionné (notez que selon la documentation , le RestLink devrait aller avant le 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]),
});

merci @crbanman vous avez sauvé ma journée! 💯

Cette page vous a été utile?
0 / 5 - 0 notes