Apollo-link-rest: Apa yang harus saya lakukan ketika server mengembalikan hasil yang tidak sesuai dengan grafik?

Dibuat pada 20 Jun 2018  ·  6Komentar  ·  Sumber: apollographql/apollo-link-rest

apa yang saya coba lakukan adalah menanyakan informasi akun ke bcoin melalui antarmuka http rest-nya.
Untuk melakukannya, saya harus

  1. tanyakan nama semua accountName dengan menelepon GET /wallet/:id/account
  2. minta detail akun GET /wallet/:id/account/:accountName

masalahnya adalah panggilan pertama akan mengembalikan sesuatu seperti ["default", "mySecondAccountName"]
yang saya tidak tahu cara mengurai sebagai respons graphql, atau meneruskan langsung ke GET

misalnya ketika saya mencoba kueri dengan mengikuti kueri,

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

Saya akan mendapatkan Error: Network error: Cannot create property 'default' on string 'default'

Saya tidak dapat menemukan petunjuk apa pun dalam dokumen, tetapi ini tampaknya kasus yang sangat umum jadi saya pasti melewatkan sesuatu yang sangat sederhana. Saya sangat menghargai jika seseorang dapat menunjukkan kepada saya apa yang harus saya cari

question❔

Komentar yang paling membantu

@joemphilips Saya pikir Anda harus menggunakan typePatcher

Saya menggunakannya untuk menangani respons yang tidak sesuai dengan graphql seperti

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

Definisi kueri

import { gql } from 'apollo-boost';

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

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

Penggunaan kueri
```js
render() {
kembali (
{({ memuat, kesalahan, data }) => {
jika (memuat) {
kembali (

Memuat...

);
}

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

}
`
``

Semua 6 komentar

Saya hanya menebak karena saya tidak terbiasa dengan bcoin, tapi ini sarannya:

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

Kemudian Anda mendapatkan hasil dari data tersebut dan meneruskannya ke kueri baru yang mendapatkan detail akun.

Terima kasih atas respon yang baik dan cepat. @fbartho
Mungkin saya seharusnya tidak menyebutkan ke bcoin, masalah saya lebih sederhana

Dalam contoh direktif @export dalam dokumen, ia memiliki contoh pemanggilan titik akhir REST dua kali .
Pertanyaan saya adalah, apa yang harus saya lakukan ketika kueri pertama dalam contoh ini mengembalikan array Skalar alih-alih array objek?
karena tidak memiliki kunci, sepertinya tidak ada cara untuk menentukan argumen mana yang harus diekspor.

Saya juga mencoba untuk tidak menggunakan @export dan alih-alih meminta seperti yang Anda sebutkan, tetapi hasil pengambilan adalah {}
dengan peringatan berikut

Missing field account in {}

omong-omong, saya pikir dalam saran Anda

query Account(id: $id)

seharusnya

query Account($id: id)

Saya menemukan bahwa ketika saya menjalankan perintah yang Anda sarankan, yaitu

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

Itu tidak akan benar-benar menjalankan kueri apa pun dan itu hanya akan mengembalikan {} sebagai data .
jadi saya harus menentukan { theFieldNameIDesire } setelah baris account , masalahnya adalah saya tidak memiliki nama bidang untuk ditentukan :(

@joemphilips Saya pikir Anda harus menggunakan typePatcher

Saya menggunakannya untuk menangani respons yang tidak sesuai dengan graphql seperti

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

Definisi kueri

import { gql } from 'apollo-boost';

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

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

Penggunaan kueri
```js
render() {
kembali (
{({ memuat, kesalahan, data }) => {
jika (memuat) {
kembali (

Memuat...

);
}

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

}
`
``

Maaf terlambat merespon. solusi Anda tampaknya tidak berfungsi untuk string/skalar array. Tapi sepertinya sudah diperbaiki . Aku akan mencoba lagi. Dan dapat dibuka kembali jika saya terus mengalami masalah. Terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat