Graphql Cant Return Array - PullRequest
       78

Graphql Cant Return Array

0 голосов
/ 20 сентября 2018

Я использую Apollo-Server и пытаюсь создать REST-запрос к IEX REST API , который возвращает данные, которые выглядят следующим образом:

{
  "symbol": "AAPL",
  "companyName": "Apple Inc.",
  "exchange": "Nasdaq Global Select",
  "industry": "Computer Hardware",
  "website": "http://www.apple.com",
  "description": "Apple Inc is an American multinational technology company. It designs, manufactures, and markets mobile communication and media devices, personal computers, and portable digital music players.",
  "CEO": "Timothy D. Cook",
  "issueType": "cs",
  "sector": "Technology",
  "tags": [
      "Technology",
      "Consumer Electronics",
      "Computer Hardware"
  ]
}

Я использую * 1008 источники данных *.Мои typeDefs и resolvers выглядят примерно так:

const typeDefs = gql`
    type Query{
        stock(symbol:String): Stock
    }

    type Stock {
        companyName: String
        exchange: String
        industry: String
        tags: String!
    }
`;
const resolvers = {
    Query:{
        stock: async(root, {symbol}, {dataSources}) =>{
            return dataSources.myApi.getSomeData(symbol)
        }
    }
};

Файл источника данных выглядит следующим образом:

class MyApiextends RESTDataSource{
    constructor(){
        super();
        this.baseURL = 'https://api.iextrading.com/1.0';
    }

    async getSomeData(symbol){
        return this.get(`/stock/${symbol}/company`)
    }
}

module.exports = MyApi

Я могу выполнить запрос и получить данные обратно, но этоне выполняет форматирование в массиве и выдает ошибку при выполнении запроса, например, так:

query{
  stock(symbol:"aapl"){
    tags
  }
}

Ошибка:

{
  "data": {
    "stock": null
  },
  "errors": [
    {
      "message": "String cannot represent value: [\"Technology\", \"Consumer Electronics\", \"Computer Hardware\"]",
      "locations": [
        {
          "line": 3,
          "column": 5
        }
      ],
      "path": [
        "stock",
        "tags"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "TypeError: String cannot represent value: [\"Technology\", \"Consumer Electronics\", \"Computer Hardware\"]",

Данные, которые я ожидаю (технологии, бытовая электроника,и компьютерное оборудование) правильны, но не возвращаются в массив.Я попытался создать новый type для тегов и установить его со свойством tag, но значение просто возвращает null.

Я очень новичок в graphql, поэтому любая обратная связь приветствуется!

1 Ответ

0 голосов
/ 20 сентября 2018

Внутри вашего определения типа для Stock вы определяете тип для поля tags как String!:

tags: String!

Это говорит GraphQL ожидать значение String, которое не будетноль.Однако фактические данные, возвращаемые конечной точкой REST, не являются String - это массив Strings.Таким образом, ваше определение должно минимально выглядеть следующим образом:

tags: [String]

Если вы хотите, чтобы GraphQL выбрасывал, если значение тега равно нулю, добавьте восклицательный знак в конец, чтобы сделать его необнуляемым:

tags: [String]!

Если вы хотите, чтобы GraphQL выдавал, если любое из значений внутри массива равно нулю, добавьте восклицательный знак в скобках.Вы также можете объединить два:

tags: [String!]!
...