Apollo-link: L'importation zen-observable interrompt les requêtes dans apollo-client lorsqu'elle est transpilée

Créé le 15 nov. 2017  ·  34Commentaires  ·  Source: apollographql/apollo-link

Merci d'avoir signalé un problème sur Apollo Link ! Assurez-vous d'inclure les informations suivantes pour vous assurer que votre problème peut donner lieu à une action. Si vous déposez une demande de fonctionnalité, vous n'avez pas besoin de suivre le plan ci-dessous, mais veuillez inclure « idée de fonctionnalité » dans le titre et inclure un exemple spécifique dans lequel cette fonctionnalité serait utile.

Salut!

Je travaille à la mise en place d'un nouveau projet avec Apollo Client, Apollo Link, babel et webpack. J'utilise un modèle de projet assez simple pour le configurer avec les suggestions documentées dans Apollo Client. Lorsque je vais l'exécuter et lui envoyer une requête, je reçois une exception d'exécution et les requêtes ne peuvent pas passer. J'ai retracé cela à la façon dont le package zen-observable est importé.

Résultat escompté :

Apollo Client peut effectuer une requête à l'aide d'Apollo Link, en utilisant le code suivant :

import { ApolloClient } from "apollo-client"
import { HttpLink } from "apollo-link-http"
import { InMemoryCache } from "apollo-cache-inmemory"
import { gql } from "graphql-tag"

const graphqlClient = new ApolloClient({
        link: new HttpLink(),
        cache: new InMemoryCache(),
})
graphqlClient.query({ query: gql`query { counter { count } }` })
        .then(console.log)
        .catch(console.error)

Résultat réel :

Le client Apollo lève l'exception suivante :

TypeError: _super.call is not a function
Stack trace:
ObservableQuery@webpack-internal:///16:56:21
QueryManager</QueryManager.prototype.watchQuery@webpack-internal:///94:404:16
QueryManager</QueryManager.prototype.query/resPromise<@webpack-internal:///94:431:20
QueryManager</QueryManager.prototype.query@webpack-internal:///94:429:26
ApolloClient</ApolloClient.prototype.query@webpack-internal:///93:102:16
@webpack-internal:///59:14:1
[59]<strong i="19">@http</strong>://host/assets/client.js:16:1
__webpack_require__<strong i="20">@http</strong>://host/assets/manifest.js:713:12
fn<strong i="21">@http</strong>://host/assets/manifest.js:118:20
[49]<strong i="22">@http</strong>://host/assets/client.js:7:18
__webpack_require__<strong i="23">@http</strong>://host/assets/manifest.js:713:12
webpackJsonpCallback<strong i="24">@http</strong>://host/assets/manifest.js:26:23
<strong i="25">@http</strong>://host/assets/client.js:1:1

Le ObservableQuery importe le Observable du projet Apollo Link, qui l'importe du package zen-observable . Une fois transpilé en JavaScript, le package apollo-link a ceci à lib/index.js :

import * as Observable from 'zen-observable';
export { Observable };

Il semble que cela provoque des cas étranges lors de la transpilation et de la sous-classification ultérieure de cet Observable, mais cela semble être l'endroit où la méthode call cesse d'être disponible grâce à mon enquête.

Comment reproduire le problème :

Vous trouverez ci-joint un projet de test qui devrait démontrer le problème. Je suppose que Node.js v6 ou v8 est installé avec Yarn. Projet d'essai

  1. Décompressez et cd dans le projet de test
  2. yarn install
  3. yarn run start et ouvrez http://localhost :3000/
  4. Vous devriez voir l'erreur ci-dessus dans la console.

Vous pouvez contourner ce problème en modifiant node_modules/apollo-link/lib/index.js:3 de :

import * as Observable from 'zen-observable';

à:

import Observable from 'zen-observable';

Le problème est que si vous effectuez cette modification dans le fichier .ts correspondant, cela provoque un échec du linting, et je ne sais pas comment le résoudre au mieux.

Il y a ce problème sur StackOverflow qui suggère que d'autres personnes ont ce problème.

Merci beaucoup pour votre temps, pour avoir regardé mon rapport de bogue et pour le travail impressionnant sur Apollo !

bug

Commentaire le plus utile

J'ai tellement de mal que je n'ai pas d'autre choix que d'utiliser le hack suivant pour contourner ce problème ...

webpack.config.js

      {
        test: /node_modules\/apollo-link.*?\/lib\/.*?.js/,
        loader: 'string-replace-loader',
        options: {
          search: 'exports.Observable = Observable',
          replace: 'exports.Observable = Observable.default'
        }
      },

J'aimerais vraiment pouvoir obtenir de l'aide ici pour pouvoir supprimer ce hack...

PS Je n'utilise pas TypeScript mais juste babel. Je ne sais pas si c'est la raison pour laquelle il est cassé pour moi

Tous les 34 commentaires

J'ai le même problème mais avec une erreur de différence.

Mon code est ici.

import 'isomorphic-fetch'
import { ApolloLink } from 'apollo-link'
import { ApolloClient } from 'apollo-client'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'

export default new ApolloClient({
  link: new HttpLink({ uri: 'http://localhost:5000/api/graphql' }),
  cache: new InMemoryCache()
})
Uncaught (in promise) TypeError: _apolloLink.Observable is not a constructor
    at HttpLink.eval [as request] (httpLink.js:98)
    at eval (link.js:60)
    at ApolloLink.eval [as request] (ApolloClient.js:30)
    at ApolloLink.eval [as request] (link.js:59)
    at execute (link.js:94)
    at eval (QueryManager.js:134)
    at new Promise (<anonymous>)
    at QueryManager.mutate (QueryManager.js:129)
    at ApolloClient.mutate (ApolloClient.js:109)
    at Header.componentDidMount (index.js:53)

J'ai essayé ce travail et j'ai eu la même erreur avec celle de @stevestreza .

```js
importer 'isomorphic-fetch'
importer * comme apolloLink depuis 'apollo-link'
importer Observable à partir de 'zen-observable'
apolloLink.Observable = Observable
````

@stevestreza @mizchi quelles versions d'apollo-client et apollo-link utilisez-vous ?

Même problème ici, avec [email protected] dans un projet webpack, résolu en supprimant le * as dans la déclaration d'importation, comme l' a souligné

Même problème ici.

Idem ici, et j'aimerais ajouter que le problème n'est pas dans Webpack, comme écrit sur SO, mais dans Apollo et/ou TypeScript.

La raison que je sais est que j'utilise Rollup pour créer un bundle au lieu de Webpack.

Je pense qu'il s'agit d'un bogue TypeScript + Rollup mais je suis surpris qu'il ne se manifeste pas dans nos propres builds Rollup. Est-ce que quelqu'un ici serait prêt à ouvrir une pull request pour apporter la modification suggérée ci-dessus ?

Même problème ici avec Rollup. Je n'utilise pas non plus Typescript.

On dirait que TS est tout foutu. J'ai essayé de construire le module pour corriger les erreurs, mais j'obtenais des erreurs TS.

Bonjour, pardonnez ma demande, mais est-ce que quelqu'un a un correctif pendant que ce problème est en cours de résolution ? une idée de la dernière version stable ?

dans mes enquêtes jusqu'à présent, je pense que ce problème ne se produit qu'en dehors de create-react-app. il existe donc une hypothèse implicite dans create-react-app qui n'est pas documentée et qui est à l'origine de ce problème _super.call is not a function .

Même problème ici, je viens de suivre la doc sur un tout nouveau projet et j'ai eu cette erreur. Je ne peux pas continuer avec Apollo.

en reliant simplement mon autre problème ici : https://github.com/apollographql/apollo-client/issues/2785#issuecomment -354169337 où il existe un correctif proposé (je n'ai pas testé)

je ne sais pas si c'est lié mais...

J'utilise rollup pour créer un bundle pour une application de réaction très simple. tout fonctionne bien jusqu'à ce que j'essaye d'introduire apollo-client dans le mix..

en suivant la documentation ici : https://www.apollographql.com/docs/react/basics/setup.html#installation

après avoir essayé de construire le projet avec le cumul, j'obtiens l'erreur suivante lors de la construction :

of is not exported by node_modules/zen-observable/index.js
47:         return new ApolloLink(function (operation, forward) {
48:             return (firstLink.request(operation, function (op) {
49:                 return nextLink.request(op, forward) || Observable.of();
                                                                       ^
50:             }) || Observable.of());
51:         });
node_modules/apollo-link/lib/link.js
of is not exported by node_modules/zen-observable/index.js
48:             return (firstLink.request(operation, function (op) {
49:                 return nextLink.request(op, forward) || Observable.of();
50:             }) || Observable.of());
                                 ^
51:         });
52:     }
node_modules/apollo-link/lib/link.js
of is not exported by node_modules/zen-observable/index.js
74: export { ApolloLink };
75: export function execute(link, operation) {
76:     return (link.request(createOperation(operation.context, transformOperation(validateOperation(operation)))) || Observable.of());
                                                                                                                                 ^
77: }

J'ai essayé de changer l'importation de node_modules/apollo-link/lib/link.js en import Observable from 'zen-observable'; comme suggéré dans le problème connexe ci-dessus, mais cela ne semble pas résoudre le problème.

Je suis confronté à un problème avec zen-observable qui est assez différent. s'il vous plaît jeter un oeil à
https://github.com/apollographql/apollo-link/issues/389
et suggérer si je fais quelque chose de mal.

J'ai tellement de mal que je n'ai pas d'autre choix que d'utiliser le hack suivant pour contourner ce problème ...

webpack.config.js

      {
        test: /node_modules\/apollo-link.*?\/lib\/.*?.js/,
        loader: 'string-replace-loader',
        options: {
          search: 'exports.Observable = Observable',
          replace: 'exports.Observable = Observable.default'
        }
      },

J'aimerais vraiment pouvoir obtenir de l'aide ici pour pouvoir supprimer ce hack...

PS Je n'utilise pas TypeScript mais juste babel. Je ne sais pas si c'est la raison pour laquelle il est cassé pour moi

J'obtiens la même erreur sans tapuscrit et je peux garantir que faire le changement

import * as Observable from 'zen-observable';
à:
import Observable from 'zen-observable';

résout le problème

putain @kinyat, je ne

Même problème dans une application Hello World basique avec react-apollo et parcel-bundler . Une solution légale ?

@alapini Je pense que l'une des solutions "légales" est qu'Apollo fournisse aux utilisateurs non dactylographiés (c'est-à-dire Babel) une version ES5 du compilateur ts.

J'utilise apollo pour mon plugin vuex-orm-apollo et la modification des fichiers dans le node_modules n'est pas une option viable pour moi. Une correction de bug bientôt serait vraiment sympa ! :)

avec la dernière version de typescript, les importations peuvent être exprimées dans la syntaxe normale des modules es, donc peut-être que si nous attendons tous qu'Apollo mette à jour la version dactylographiée, cela fonctionnera immédiatement pour nous non utilisateurs de TS.

Je pense que je rencontre certains des problèmes énumérés ici. Première fois que j'utilise apollo, je ne suis donc pas sûr à 100% de connecter les choses correctement. J'utilise rollup sans tapuscrit avec inferno.

The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten
The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten
The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten

'of' is not exported by 'node_modules/zen-observable/index.js'
'of' is not exported by 'node_modules/zen-observable/index.js'
'of' is not exported by 'node_modules/zen-observable/index.js'

(node:37350) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: 'print' is not exported by node_modules/graphql/language/printer.js
(node:37350) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code

Pour ceux qui utilisent parcel.js, ce PR semble temporairement résoudre le problème : https://github.com/parcel-bundler/parcel/pull/530

Je n'ai pas plongé trop profondément dans ce problème, mais il semble que le cœur du problème, comme le note @fathyb ici , soit :

Le comportement actuel de Babel est tout à fait correct et respecte la spécification ES6. L'importation d'une exportation par défaut avec un caractère générique est illégale, les erreurs ici sont donc légitimes.

Cependant, les gens ( #418 ) et les bibliothèques (antd, @blueprintjs/core, etc.) comptent toujours sur cela. L'idée est d'être plus tolérant en assouplissant la spécification sur les espaces de noms exotiques.

Il semble donc que la solution de contournement publiée par @stevestreza (suppression de * as ) soit une solution légitime pour apollo-link, non ?

Fwiw, je recevais l'erreur _apolloLink.Observable is not a constructor , et elle disparaît si j'utilise le parcel.js PR noté ci-dessus (ou reviens à parcel.js 1.2.1 comme indiqué dans apollo-client/issues/2785 )

J'ai également ce problème en utilisant Rollup dans un projet Vuejs.

merci pour le partage @tadas412

Le PR ci-dessus a été publié en 1.2.0. Faites-moi savoir si ce n'est toujours pas résolu !

toujours une erreur avec 1.2.0 😢

TypeError: _super.call is not a function
    at new ObservableQuery
    at QueryManager.watchQuery 
    at eval 
    at new Promise 
    at QueryManager.query 
    at ApolloClient.query
    at VueComponent.created

cela semble également être suivi ici apollographql/apollo-client/issues/2785

Pour moi, cela fonctionne avec la 1.2.0.

@littletower Cela peut sembler stupide, mais êtes-vous sûr que vous utilisez la version 1.2.0 ? Supprimez peut-être le répertoire node_modules et réinstallez les packages ? Je ne faisais que demander :)

@phortx ouais je l'ai déjà fait :(
Je pourrais ajouter que j'utilise des abonnements, je ne sais pas si cela change quelque chose

@littletower C'est étrange. J'obtenais la même erreur avec 1.1.0 et 1.2.0 semblaient le résoudre. apollo-client a une dépendance sur apollo-link , il se peut donc que sa dépendance n'ait pas été mise à jour. Pouvez-vous créer un dépôt de reproduction?

Le changement a définitivement résolu le problème réel au niveau du code, mais il semble que yarn provoque un conflit.

  • Lorsque j'utilise npm install pour installer les dépendances, il charge apollo-link 1.2.0 sans aucun changement par rapport à apollo-client . Cela fonctionne très bien et le problème signalé ne se produit plus. (Vous devez installer manuellement graphql-tag et supprimer les accolades dans l'import dans src/client/index.js pour le vérifier)
  • Lorsque j'utilise yarn install , il installe la version apollo-link 1.0.0. Lorsque je yarn add apollo-link pour installer explicitement la 1.2.0, la version dans node_modules/apollo-link devient 1.2.0, mais une autre version de apollo-link 1.0.0 est installée à node_modules/apollo-client/node_modules/apollo-link .

J'ai dépassé mes connaissances à ce stade sur la façon dont le fil fonctionne pour résoudre ce problème (je m'attendrais à ce qu'il ait installé apollo-link 1.2.0, pas 1.0.0). Je suppose que le "bon" correctif consiste à exiger apollo-link 1.2.0 dans le package.json pour apollo-client . Je vais déposer une note dans apollographeql/apollo-client#2785.

Quoi qu'il en soit, cela semble complètement corrigé ici!

@evans J'ai créé un

J'obtiens la même erreur dans un projet Polymer 3 et apollo-boost :

import { HttpLink } from 'apollo-link-http';

cause

Uncaught SyntaxError: The requested module '../../zen-observable/index.js'
                      does not provide an export named 'default'

@heruan Avez-vous trouvé une solution ? Je suis confronté au même problème.

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