使用 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
}
}
问题
朋友们大家好,
我正在转换我的 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
}
}