Apollo-link-rest: ¿Qué debo hacer cuando el servidor devuelve un resultado no compatible con graphql?

Creado en 20 jun. 2018  ·  6Comentarios  ·  Fuente: apollographql/apollo-link-rest

lo que estoy tratando de hacer es consultar la información de la cuenta a bcoin a través de su interfaz http rest.
Para hacerlo, debo

  1. pregunte los nombres de todos los accountName llamando al GET /wallet/:id/account
  2. solicite los detalles de la cuenta antes de GET /wallet/:id/account/:accountName

El problema es que la primera llamada devolverá algo como ["default", "mySecondAccountName"]
que no sé cómo analizar como respuesta graphql, ni pasar directamente al segundo GET

por ejemplo, cuando intenté realizar una consulta siguiendo la consulta,

query (id: "primary") @rest(type: AccountName, path: "/wallet/:id/account") {
  default

Obtendré Error: Network error: Cannot create property 'default' on string 'default'

No pude encontrar ninguna pista en el documento, pero este parece un caso muy común, así que debo estar perdiendo algo muy simple. Realmente agradezco si alguien pudiera señalarme lo que debo buscar.

question❔

Comentario más útil

@joemphilips Creo que deberías usar un typePatcher

Lo uso para manejar una respuesta no compatible con graphql como

{
   "100": {
      "id": 100,
      "node_id": 105,
      "category_id": 8,
      "title": "Title 100",
      "highlight": true
   },
   "138": {
      "id": 138,
      "node_id": 106,
      "category_id": 7,
      "title": "Title 138",
      "highlight": false
   },
   "140": {
      "id": 140,
      "node_id": 101,
      "category_id": 9,
      "title": "Title 140",
      "highlight": false
   },
   "158": {
      "id": 158,
      "node_id": 146,
      "category_id": 4,
      "title": "Title 158",
      "highlight": false
   }
}

Definición de consulta

import { gql } from 'apollo-boost';

export const GET_NEWS_QUERY = gql`
  query getNews {
    News @rest(type: "News", path: "news") {
      data
    }
  }
`;

Configuración de RestLink

const restLink = new RestLink({
  uri: API_URL,
  typePatcher: {
    News: (data, outerType) => {
      if (outerType === 'News') {
        data = Object.keys(data).map(id => {
          const result = data[id];

          if (result) {
            return {
              __typename: 'News',
              ...result
            };
          }
        });
      }

      return { data };
    }
  }
});

Uso de consultas
`` js
render () {
regreso (
{({cargando, error, datos}) => {
if (cargando) {
regreso (

Cargando...

);
}

      if (error) {
        return (
          <View>
            <Text>Error :(</Text>
          </View>
        );
      }

      const news = data && data.News && data.News.data;
      const filteredNews = news && news.filter(Boolean);

      return (
        <Styles.Container>
          <Carousel
            data={filteredNews}
            handleOnPress={this.navigateToScreen}
          />
        </Styles.Container>
      );
    }}
  </Query>
);

}
'
''

Todos 6 comentarios

Solo supongo que no estoy familiarizado con bcoin, pero aquí hay una sugerencia:

query Account(id: $id){
   account(id: $id) @rest(type: "[String]", path: "/wallet/:id/account")
}

Luego, obtiene los resultados de los datos y los pasa a una nueva consulta que obtiene los detalles de la cuenta.

Gracias por su amable y rápida respuesta. @fbartho
Quizás no debería haberle mencionado a bcoin, mi problema es más simple

En el ejemplo de la directiva @export en el documento, tiene un ejemplo de llamada al punto final REST dos veces .
Mi pregunta es, ¿qué debo hacer cuando la primera consulta en este ejemplo devuelve una matriz de Scalar en lugar de una matriz de objeto?
como no tiene clave, parece que no hay forma de especificar qué argumento se debe exportar.

También intenté no usar @export y en su lugar consultar como mencionaste, pero el resultado de la búsqueda es {}
con la siguiente advertencia

Missing field account in {}

por cierto, creo que en tu sugerencia

query Account(id: $id)

debiera ser

query Account($id: id)

Descubrí que cuando ejecuto el comando que sugieres, es decir

query Account(id: $id){
   account(id: $id) @rest(type: "[String]", path: "/wallet/:id/account")
}

En realidad, no ejecutará ninguna consulta y solo devolverá {} como data .
así que debo especificar { theFieldNameIDesire } después de la línea de account , el problema es que no tengo un nombre de campo para especificar :(

@joemphilips Creo que deberías usar un typePatcher

Lo uso para manejar una respuesta no compatible con graphql como

{
   "100": {
      "id": 100,
      "node_id": 105,
      "category_id": 8,
      "title": "Title 100",
      "highlight": true
   },
   "138": {
      "id": 138,
      "node_id": 106,
      "category_id": 7,
      "title": "Title 138",
      "highlight": false
   },
   "140": {
      "id": 140,
      "node_id": 101,
      "category_id": 9,
      "title": "Title 140",
      "highlight": false
   },
   "158": {
      "id": 158,
      "node_id": 146,
      "category_id": 4,
      "title": "Title 158",
      "highlight": false
   }
}

Definición de consulta

import { gql } from 'apollo-boost';

export const GET_NEWS_QUERY = gql`
  query getNews {
    News @rest(type: "News", path: "news") {
      data
    }
  }
`;

Configuración de RestLink

const restLink = new RestLink({
  uri: API_URL,
  typePatcher: {
    News: (data, outerType) => {
      if (outerType === 'News') {
        data = Object.keys(data).map(id => {
          const result = data[id];

          if (result) {
            return {
              __typename: 'News',
              ...result
            };
          }
        });
      }

      return { data };
    }
  }
});

Uso de consultas
`` js
render () {
regreso (
{({cargando, error, datos}) => {
if (cargando) {
regreso (

Cargando...

);
}

      if (error) {
        return (
          <View>
            <Text>Error :(</Text>
          </View>
        );
      }

      const news = data && data.News && data.News.data;
      const filteredNews = news && news.filter(Boolean);

      return (
        <Styles.Container>
          <Carousel
            data={filteredNews}
            handleOnPress={this.navigateToScreen}
          />
        </Styles.Container>
      );
    }}
  </Query>
);

}
'
''

Lamento responder tarde. su solución parece no funcionar para la cadena / escalar de la matriz. Pero parece arreglado . Lo intentaré otra vez. Y puede que vuelva a abrir si sigo teniendo problemas. Gracias.

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