1

GraphQL/express/express-graphql/axios を使用して、CryptoCompare API から特定のコイン データを取得しています。

2 つのエンドポイントがあります。

1) https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,LTC,BCH,NEO,ETC,XMR&tsyms=USD

From endpoint 1, I want to retrieve the following in USD for 8 coins:
  - FROMSYMBOL, CHANGEPCT24HOUR, PRICE, MKTCAP, TOTALVOLUME24HTO

2) https://min-api.cryptocompare.com/data/coin/generalinfo?fsyms=BTC&tsym=USD

From endpoint 2, I want to retrieve the following just for Bitcoin/BTC:
  - Id, FullName, ImageUrl

2 つのファイルを使用してバックエンド サーバーをセットアップし、graphiql を使用してクエリをテストしました。

ファイル 1 - server.js

const express = require("express")
const graphqlHTTP = require("express-graphql")
const cors = require("cors")
const schema = require("./schema")

const app = express()

app.use(cors())

app.use(
  "/graphql",
  graphqlHTTP({
    schema,
    graphiql: true
  })
)

const PORT = process.env.PORT || 4000

app.listen(PORT, console.log(`✅  Listening to port ${PORT}`))

ファイル 2 - schema.js

const {
  GraphQLObjectType,
  GraphQLList,
  GraphQLID,
  GraphQLInt,
  GraphQLString,
  GraphQLSchema
} = require("graphql")
const axios = require("axios")

const CoinDataType = new GraphQLObjectType({
  name: "CoinData",
  fields: () => ({
    FROMSYMBOL: { type: GraphQLString },
    CHANGEPCT24HOUR: { type: GraphQLInt },
    PRICE: { type: GraphQLInt },
    MKTCAP: { type: GraphQLInt },
    TOTALVOLUME24HTO: { type: GraphQLInt }
  })
})

const CoinInfoType = new GraphQLObjectType({
  name: "CoinInfo",
  fields: () => ({
    Id: { type: GraphQLID },
    FullName: { type: GraphQLString },
    ImageUrl: { type: GraphQLString }
  })
})

const Query = new GraphQLObjectType({
  name: "Query",
  fields: {
    CoinData: {
      type: new GraphQLList(CoinDataType),
      resolve(parent, args) {
        return axios
          .get(
            "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,LTC,BCH,NEO,ETC,XMR&tsyms=USD"
          )
          .then(res => res.data)
      }
    },
    CoinInfo: {
      type: new GraphQLList(CoinInfoType),
      resolve(parent, args) {
        return axios
          .get(
            "https://min-api.cryptocompare.com/data/coin/generalinfo?fsyms=BTC&tsym=USD"
          )
          .then(res => res.data)
      }
    }
  }
})

module.exports = new GraphQLSchema({ query: Query })

これでクエリをテストするためにgraphiqlを使用すると:

{
  CoinData {
    FROMSYMBOL
  }
  CoinInfo {
    Id
  }
}

...次のエラーが表示されます。

{
  "errors": [
    {
      "message": "Expected Iterable, but did not find one for field Query.CoinInfo.",
      "locations": [
        {
          "line": 5,
          "column": 3
        }
      ],
      "path": [
        "CoinInfo"
      ]
    },
    {
      "message": "Expected Iterable, but did not find one for field Query.CoinData.",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "CoinData"
      ]
    }
  ],
  "data": {
    "CoinData": null,
    "CoinInfo": null
  }
}

このエラーを回避するにはどうすればよいですか? ありがとう。

4

0 に答える 0