Как получить значение поля с пробелом, дефис в REST API в GraphQL - PullRequest
0 голосов
/ 23 декабря 2019

Конечная точка API REST - https://api.jikan.moe/v3/manga/13

Поля «Альтернативная версия», «Дополнительный сюжет» и «Выделение» содержат пробел и дефис.

enter image description here

common_schema.js

const { gql } = require('apollo-server');

const typeDefs = gql`

    type RelatedType {
        Adaptation: [RelatedSubType]
        SideStory: [RelatedSubType]
        Character: [RelatedSubType]
        Summary: [RelatedSubType]
        Other: [RelatedSubType]
        AlternativeVersion: [RelatedSubType]
        SpinOff: [RelatedSubType]
    }

    type RelatedSubType {
        mal_id: ID
        type: String
        name: String
        url: String
    }
`;

module.exports = typeDefs;

Если я записываю значение поля как Spin-off или Alternative version, то это приводит к ошибке в терминале. "Spin-off" также не работает. Я знаю, что они недействительны, но затем также пытались.

manga_resolver.js

module.exports = {
    Query: {
        manga: (_, { id }, { dataSources }) =>
            dataSources.mangaAPI.getMangaDetail(id)
    }
};

manga.js

const { RESTDataSource } = require('apollo-datasource-rest');

class MangaAPI extends RESTDataSource {
    constructor() {
        super();
        this.baseURL = 'https://api.jikan.moe/v3/manga/';
    }

    async getMangaDetail(mal_id) {
        const response = await this.get(`/${mal_id}`);
        return response;
    }
}

module.exports = MangaAPI;

Запрос -

query getMangaDetail{
manga(id: 13){
    related{
      Adaptation{
        name
      }
      AlternativeVersion{
        name
      }
      SpinOff{
        name
      }
    }
  }
}

Получение null в тех полях, которые имеют пробел и дефис.

Результат запроса -

{
"data": {
    "manga": {
      "related": {
        "Adaptation": [
          {
            "name": "One Piece"
          }
        ],
        "AlternativeVersion": null,
        "SpinOff": null
      }
    }
  }
}

Репозиторий - jikan-graphql

1 Ответ

1 голос
/ 23 декабря 2019

Согласно спецификации имена в GraphQL должны иметь следующий формат:

/[_A-Za-z][_0-9A-Za-z]*/

Другими словами, ни пробелы, ни тире не допускаются. Если ваш источник данных возвращает имена свойств, которые отформатированы неправильно, вы можете просто предоставить средства распознавания для рассматриваемых полей:

const resolvers = {
  RelatedType: {
    sideStory: (parent) => {
      return parent['Side story']
    },
    ...
  }
}
...