使用 graphql 在 apollo 服务器中指定类型时出现问题

Problem specifying a type in apollo server using graphql

问题

朋友们大家好,

我正在转换我的 cinenmight API 以与 graphql 兼容。我在尝试生成 Extra type 的结构时遇到问题,您可以在下面的例子中看到 link https://cinemanight.chrismichael.now.sh/api/v1/series/1

它向我显示了与 Field \" extra \ "of type \" [Extra!]! \ "must have a selection of subfields. Did you mean \ "extra {...} \"?

相关的错误

根据我向您展示的端点路由示例; Extra是list类型,所以我定义为[Extra],但显然不应该是那种类型。

如有任何帮助,我将不胜感激!

错误

{
  "error": {
    "errors": [
      {
        "message": "Field \"extra\" of type \"[Extra!]!\" must have a selection of subfields. Did you mean \"extra { ... }\"?",
        "locations": [
          {
            "line": 10,
            "column": 5
          }
        ],
        "extensions": {
          "code": "GRAPHQL_VALIDATION_FAILED",
          "exception": {
            "stacktrace": [
              "GraphQLError: Field \"extra\" of type \"[Extra!]!\" must have a selection of subfields. Did you mean \"extra { ... }\"?",
              "    at Object.Field (C:\Users\c\Desktop\cinemanight-graphql\node_modules\graphql\validation\rules\ScalarLeafs.js:45:31)",
              "    at Object.enter (C:\Users\c\Desktop\cinemanight-graphql\node_modules\graphql\language\visitor.js:324:29)",
              "    at Object.enter (C:\Users\c\Desktop\cinemanight-graphql\node_modules\graphql\language\visitor.js:375:25)",
              "    at visit (C:\Users\c\Desktop\cinemanight-graphql\node_modules\graphql\language\visitor.js:242:26)",
              "    at Object.validate (C:\Users\c\Desktop\cinemanight-graphql\node_modules\graphql\validation\validate.js:73:24)",
              "    at validate (C:\Users\c\Desktop\cinemanight-graphql\node_modules\apollo-server-core\dist\requestPipeline.js:212:32)",
              "    at Object.<anonymous> (C:\Users\c\Desktop\cinemanight-graphql\node_modules\apollo-server-core\dist\requestPipeline.js:125:42)",
              "    at Generator.next (<anonymous>)",
              "    at fulfilled (C:\Users\c\Desktop\cinemanight-graphql\node_modules\apollo-server-core\dist\requestPipeline.js:5:58)",
              "    at process._tickCallback (internal/process/next_tick.js:68:7)"
            ]
          }
        }
      }
    ]
  }
}
const {gql} = require('apollo-server');

const typeDefs = gql `
  extend type Query{
    series(page: Int!): [Series!]!
  }

  type Series{ 
    id: String!
    title: String!
    sinopsis: String!
    poster: String!
    rating: String!
    year: String!
    extra: [Extra!]!
  }

  type Extra{ 
    channel: String!
    first_air_date: String!
    last_air_date: String!
    total_seasons: String!
    total_episodes: String
    season_list: [SeasonList!]! 
    cast_members: CastMembers!
    similar_series: [SimilarSeries!]!
  }

  type SeasonList{ 
    season: Int 
    episodes: [String]
  }

  type SimilarSeries{ 
    id: String!
    poster: String!
  }

  type CastMembers{ 
    creator: Creator!
    members_list: [MembersList!]!
  }

  type MembersList{ 
    members_info: [MembersInfo!]!
  }

  type MembersInfo{
    characters: Characters!
  }

  type Characters{
    real_name: String!
    character: String!
  }

  type Creator{
    name: String! 
    poster: String!
  }
`;

const resolvers ={
  Query:{
    series: async(_source , {page} , { dataSources }) =>{
      return dataSources.API.getAllSeries(page)
        .then(doc =>{
          return doc.series
        });
    }
  }
}

module.exports = {
  typeDefs,
  resolvers
}

我认为这里发生的是 GraphQL 要求您列出您需要的字段。您不能只 return 整个数据字段而不列出您需要的子字段。这就是 GraphQL 的本质,只 return 你需要的数据。

根据您的代码示例,您可以执行类似的操作。

query allseries{
    id
    title
    sinopsis
    poster
    extra{
        channel
        first_air_date
        season_list
        cast_members
    }
}

通过上述查询,您已经从“系列”和“额外”字段中列出了您需要的内容。如果您需要所有子字段,您将在查询中丢失它。希望能帮助到你。

查询对象时请在查询中添加子字段。这就是它的工作原理。

尝试在查询中 extra 内使用 channel

{
  series(page: 1) 
  {
    id
    title
    synopsis
    poster
    rating
    year
    extra {
      channel
    }
  }
}

当您想要查询答案时,您必须将所有字段和子字段放入查询中。或者,您可以完全不使用对象字段进行查询 -

{ 
  series (page: 1) 
  { 
    id 
  }
}