Apollo-link-rest: Was soll ich tun, wenn der Server ein nicht graphql-konformes Ergebnis zurückgibt?

Erstellt am 20. Juni 2018  ·  6Kommentare  ·  Quelle: apollographql/apollo-link-rest

Was ich versuche, ist, Kontoinformationen über die http- bcoin abzufragen.
Dazu muss ich

  1. fragen Sie die Namen aller existierenden accountName indem Sie GET /wallet/:id/account anrufen
  2. fragen Sie bis GET /wallet/:id/account/:accountName

Das Problem ist, dass der erste Aufruf etwas wie ["default", "mySecondAccountName"]
die ich nicht als graphql-Antwort parsen oder direkt an die zweite GET

z. B. als ich versucht habe abzufragen, indem ich folgende Abfrage nutze,

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

Ich bekomme Error: Network error: Cannot create property 'default' on string 'default'

Ich konnte im Dokument keinen Hinweis finden, aber dies scheint ein sehr häufiger Fall zu sein, daher muss mir etwas sehr Einfaches fehlen. Ich wäre sehr dankbar, wenn mir jemand zeigen könnte, wonach ich suchen sollte

question❔

Hilfreichster Kommentar

@joemphilips Ich denke, du solltest einen typePatcher verwenden

Ich verwende es, um nicht graphql-konforme Antworten zu verarbeiten, wie z

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

Abfragedefinition

import { gql } from 'apollo-boost';

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

RestLink-Konfiguration

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

Abfragenutzung
```js
render() {
Rückkehr (
{({ Laden, Fehler, Daten }) => {
if (laden) {
Rückkehr (

Wird geladen...

);
}

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

}
`
``

Alle 6 Kommentare

Ich vermute nur, da ich mit Bcoin nicht vertraut bin, aber hier ist ein Vorschlag:

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

Dann erhalten Sie die Ergebnisse aus den Daten und übergeben sie an eine neue Abfrage, die die Kontodetails abruft.

Danke für die freundliche und schnelle Antwort. @fbartho
Vielleicht hätte ich bcoin nicht erwähnen sollen, mein Problem ist einfacher

Im Beispiel der @export Direktive im Dokument gibt es ein Beispiel für den zweimaligen Aufruf des REST-Endpunkts .
Meine Frage ist, was soll ich tun, wenn die erste Abfrage in diesem Beispiel ein Array von Scalar anstelle eines Arrays von Objekten zurückgibt?
da es keinen Schlüssel hat, scheint es keine Möglichkeit zu geben, anzugeben, welches Argument exportiert werden soll.

Ich habe auch versucht, @export und stattdessen abzufragen, wie Sie es erwähnt haben, aber das Ergebnis des Abrufs ist {}
mit folgender Warnung

Missing field account in {}

Übrigens denke ich an deinen Vorschlag

query Account(id: $id)

sollte sein

query Account($id: id)

Ich habe herausgefunden, dass beim Ausführen des von Ihnen vorgeschlagenen Befehls, dh

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

Es führt keine Abfrage aus und gibt nur {} als data .
Also muss ich { theFieldNameIDesire } nach der Zeile von account angeben, das Problem ist, dass ich keinen Feldnamen angeben muss:(

@joemphilips Ich denke, du solltest einen typePatcher verwenden

Ich verwende es, um nicht graphql-konforme Antworten zu verarbeiten, wie z

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

Abfragedefinition

import { gql } from 'apollo-boost';

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

RestLink-Konfiguration

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

Abfragenutzung
```js
render() {
Rückkehr (
{({ Laden, Fehler, Daten }) => {
if (laden) {
Rückkehr (

Wird geladen...

);
}

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

}
`
``

Entschuldigung, dass ich spät antworte. Ihre Lösung scheint für String/Skalar des Arrays nicht zu funktionieren. Aber es scheint behoben zu sein . Ich werde es nochmal versuchen. Und kann wieder öffnen, wenn ich weiterhin Probleme habe. Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen