Apollo-link-rest: "TypeError: forward no es una función"

Creado en 14 nov. 2018  ·  19Comentarios  ·  Fuente: apollographql/apollo-link-rest

Hola

Me he encontrado con el mismo error cada vez que he usado apollo-link-rest: abrir GraphiQL en las herramientas de desarrollo de Apollo siempre muestra un error "TypeError: forward is not a function". El texto completo del error:

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

Las consultas y mutaciones con la directiva @rest parecen estar funcionando bien y no arrojan ningún otro error, por lo que no es un problema de bloqueo completo, pero potencialmente afecta algunas otras capacidades de Apollo Client, por ejemplo, intentar usar la directiva @client no funciona y arroja el mismo error (como la carga útil de error en uncomponente de react-apollo).

Cloné los tres proyectos react-apollo de ejemplo (simple, avanzado, mecanografiado) y aparece el mismo error en los tres. # 121 hace referencia a este problema, pero no parece haber una solución; la corrección que se incluye es para un error "no se pudo recuperar" por separado. También se menciona la falta de una directiva @rest o @client como una causa potencial, pero como se mencionó, esto está sucediendo con los proyectos de muestra y con el mío, por lo que no creo que una directiva faltante sea la culpable.

Para reproducir, simplemente clone los proyectos de ejemplo, instale e inicie y abra las herramientas de desarrollo de Apollo en Chrome (la versión actual en la que tengo este error es 70.0.3538.77).

¡Gracias por mirar esto, me encanta el paquete y lo encuentra increíblemente útil!

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

Comentario más útil

¡Hola! Pude analizar un poco qué está causando este problema.
Parece que apollo-client-devtools llama a esta operación .

Sin embargo, cuando llega aquí , forward no está definido.

No estoy completamente seguro de cómo funciona todo esto, de lo contrario, haría un PR para solucionar el problema. Cuando cambié el cheque !isRestQuery a !isRestQuery && forward pude silenciar el error anterior. Sin embargo, recibí un nuevo error:

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

Aquí hay una aplicación de ejemplo que usé para ver / depurar este problema: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

Gracias por todo su trabajo en esta biblioteca. Si puedo ayudar de alguna manera, me alegrará hacerlo.

Todos 19 comentarios

No creo que GraphIQL admita apollo-link-state / apollo-link-rest; no creo que admitan enlaces en general. ¿Tiene ejemplos de que funcione?

Claro, GraphiQL en las herramientas de desarrollo de Apollo parece funcionar. Usando la api JSONPlaceholder , RestLink uri configurado en https://jsonplaceholder.typicode.com : esto es lo que obtengo inicialmente antes de que se ejecuten las consultas:

apollo-devtools-initial

después de ejecutar la consulta para obtener todos los usuarios:

apollo-devtools-users

o con el proyecto de ejemplo "simple":

apollo-devtools-simple

Otra cosa que he notado es que la opción "leer desde la caché" no funciona con las nuevas entradas creadas con la api JSONPlaceholder; una mutación POST escribe una nueva entrada en la caché correctamente, pero una consulta posterior intenta consultar de forma remota incluso con la opción "leer desde la caché" seleccionada. Como la nueva entrada no se crea realmente, esto devuelve un valor nulo desde el punto final remoto como se esperaba, pero se crea en el caché, por lo que "leer desde el caché" debería devolverlo. Esto probablemente sea agnóstico a apollo-link-rest, y fuera del alcance de esta edición, pero sigue siendo interesante.

Recibo el mismo error en GraphiQL, forward is not a function . Sin embargo, todo lo que no sea cache parece estar funcionando.

Cualquier actualización sobre estos chicos, tuve el mismo problema :(

@cstoddart Su panel de caché está vacío, ¿correcto?

¿Alguien sabe cómo ver el caché sin las herramientas de desarrollo?

Estoy experimentando lo mismo. @cgatian sí, mi panel de caché está vacío.

Es difícil adoptar la cadena de herramientas de Apollo cuando estas roturas ocurren durante tanto tiempo. ¿Se sigue trabajando activamente en apollo-link-rest?

@heymanhn - Sí, ApolloLinkRest se está desarrollando activamente. Pero esto es de código abierto. Me complace ayudarlo a obtener una prueba de relaciones públicas y la entrega, pero no tengo experiencia con ApolloDevTools.

Necesitamos a alguien que lo haga, o que esté dispuesto a sumergirse en su código base para descubrir qué es necesario para ser compatible con él. ¡Te desafío a que descubras lo que falta y me encantaría apoyar tus contribuciones!

Quiero dejar claro que no sé que apollo-link-rest alguna vez funcionó con ApolloDevTools, así que diría que esto es menos una rotura y más una característica deseada que falta .

Además, personalmente uso apollo-link-rest con React-Native, y hace un año, ApolloDevTools no era compatible con React-Native.

Desde entonces, anunciaron que arreglaron eso, pero no he podido activar ApolloDevTools para el proyecto nativo de reacción de mi equipo, así que no sé qué está mal allí.

¡Hola! Pude analizar un poco qué está causando este problema.
Parece que apollo-client-devtools llama a esta operación .

Sin embargo, cuando llega aquí , forward no está definido.

No estoy completamente seguro de cómo funciona todo esto, de lo contrario, haría un PR para solucionar el problema. Cuando cambié el cheque !isRestQuery a !isRestQuery && forward pude silenciar el error anterior. Sin embargo, recibí un nuevo error:

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

Aquí hay una aplicación de ejemplo que usé para ver / depurar este problema: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

Gracias por todo su trabajo en esta biblioteca. Si puedo ayudar de alguna manera, me alegrará hacerlo.

Me he encontrado con esto recientemente y he reducido el error en mi caso a IntrospectionQuery, que creo que graphiql / devtools consulta el servidor graphql para el esquema. El problema es que solo estoy usando apollo-client y apollo-link-rest, por lo que no hay un servidor o esquema, excepto por el esquema de caché (si lo hay). A su vez, mi apollo devtools está en blanco. No estoy seguro de cuál sería la solución aquí, todo funcionó en un momento.

Me he encontrado con esto recientemente y he reducido el error en mi caso a IntrospectionQuery, que creo que graphiql / devtools consulta el servidor graphql para el esquema. El problema es que solo estoy usando apollo-client y apollo-link-rest, por lo que no hay un servidor o esquema, excepto por el esquema de caché (si lo hay). A su vez, mi apollo devtools está en blanco. No estoy seguro de cuál sería la solución aquí, todo funcionó en un momento.

Aquí igual

Vimos a ApolloDevTools trabajando con apollo-link-state, apollo-link-Rest en React Native Debugger, el jueves pasado. ¿Estamos seguros de que sigue siendo un problema activo? ¿Qué versiones tienes en @ edgars-sirokovs?

Vimos a ApolloDevTools trabajando con apollo-link-state, apollo-link-Rest en React Native Debugger, el jueves pasado. ¿Estamos seguros de que sigue siendo un problema activo? ¿Qué versiones tienes en @ edgars-sirokovs?

@fbartho 2.2.4

@fbartho acaba de comprobarlo de nuevo, ahora está funcionando. Al menos ya no está en blanco.
Sin embargo, todavía tengo problemas: no puedo desplazar la vista de caché y el Explorador de documentación no muestra el esquema (solo he pasado el esquema del lado del cliente a través de typeDefs ).

No sé qué necesita el explorador de documentación para admitir apollo-link-rest, pero no me sorprendería si hay trabajo por hacer y / o nunca funcionará bien. ¡Aceptando RP si se necesita trabajo aquí!

Desplazarse por la vista de caché definitivamente parece un error en el código de ApolloDevTools,

¡Pero me alegro de que hayas progresado, @ edgars-sirokovs!

Vimos a ApolloDevTools trabajando con apollo-link-state, apollo-link-Rest en React Native Debugger, el jueves pasado. ¿Estamos seguros de que sigue siendo un problema activo? ¿Qué versiones tienes en @ edgars-sirokovs?

Lo pruebo con el proyecto simple y no funciona, la pestaña Apollo DevTools está disponible pero siempre está en blanco y aparece el siguiente error. https://github.com/apollographql/apollo-link-rest/tree/master/examples/simple

@fbartho Hice lo mismo con el proyecto en el que estoy trabajando react native con react-native-debugger y tuve el mismo problema. ¿Podrías compartir tu configuración o qué versiones estabas usando?

Hoy nos enteramos de que funciona, pero no la pestaña GraphiQL, solo las otras pestañas: https://github.com/apollographql/apollo-client-devtools/issues/227

Debido a lo que parece ser el mismo problema, no puedo leer el esquema local Docs en devtools GraphiQL.

La ejecución de esta consulta de introspección muestra [object Object] en el panel de respuesta y la consola informa [Network error]: TypeError: forward is not a function

{
  __schema {
    types {
      name
    }
  }
}

Mi cliente no tiene 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;
}

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

No estoy seguro de si esto está exactamente relacionado con el caso de uso como todos los anteriores, pero este es el único resultado de búsqueda relevante que pude encontrar con el error que estaba obteniendo y que finalmente resolví.

Recientemente encontré este error cuando intentaba agregar apollo-link-rest a una aplicación existente usando @apollo/client .

tl; dr El problema resultó ser que no puede pasar tanto uri como link como parámetros de opción al definir un nuevo ApolloCient . En su lugar, debe eliminar el parámetro uri y crear un HttpLink usando createHttpLink y luego usar from() para combinar sus enlaces y ellos al link parámetro de opción.

Antes de agregar el enlace de descanso, así es como se veía mi definición:

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

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

Al leer la documentación, tuve la impresión de que debería poder agregar un enlace de descanso definiendo un nuevo RestLink y agregando el parámetro adicional link a mis opciones de esta manera:

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

Sin embargo, esta configuración provocó que se produjera el error TypeError: forward is not a function y que el cliente dejara de funcionar.

Después de leer más en la documentación sobre los enlaces, me di cuenta (aunque no pude verlo explícitamente dicho, y puede haber casos en los que esto sea incorrecto) que no puede usar uri y link parámetros de opción en la definición ApolloClient al mismo tiempo. Usando esta nueva información pude solucionar el problema eliminando el parámetro uri y creando un HttpLink que luego combiné con RestLink usando from() y todo finalmente funcionó (tenga en cuenta que según la documentación , el RestLink debe ir antes del 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]),
});

gracias @crbanman me salvaste el día! 💯

¿Fue útil esta página
0 / 5 - 0 calificaciones