为啥我的 Graphql 查询返回 null? [复制]
Posted
技术标签:
【中文标题】为啥我的 Graphql 查询返回 null? [复制]【英文标题】:Why is my Graphql query returning null? [duplicate]为什么我的 Graphql 查询返回 null? [复制] 【发布时间】:2018-04-13 03:09:26 【问题描述】:我正在尝试为所有人设置一个 graphql 应用程序,以便轻松访问来自 games.espn.com 的数据,但我遇到了查询返回 null 的问题。我想知道我是否可能在某处错过了返回或解析功能?我已经搜索这段代码几天了,似乎无法弄清楚为什么它没有返回值。
这是我的 schema.js 文件:
const
GraphQLObjectType,
GraphQLString,
GraphQLInt,
GraphQLSchema,
GraphQLList,
GraphQLNonNull,
GraphQLBoolean,
GraphQLFloat
= require('graphql');
const axios = require('axios');
const request = require('request');
const PlayerType = new GraphQLObjectType(
name: 'Player',
fields:() => (
droppable: type:GraphQLBoolean,
percentStarted: type:GraphQLFloat,
jersey: type:GraphQLString,
playerRatingSeason: type:GraphQLFloat,
isIREligible: type:GraphQLBoolean,
draftRank: type:GraphQLInt,
universeId: type:GraphQLInt,
firstName: type:GraphQLString,
lastName: type:GraphQLString,
sportsId: type:GraphQLInt,
healthStatus: type:GraphQLInt,
percentOwned: type:GraphQLFloat,
proTeamId: type:GraphQLInt,
tickerId: type:GraphQLInt,
isActive: type:GraphQLBoolean,
playerId: type:GraphQLInt,
percentChange: type:GraphQLFloat,
defaultPositionId: type: GraphQLInt,
totalPoints: type:GraphQLFloat,
)
);
const CurrentPeriodProjectedStatsType = new GraphQLObjectType(
name: 'CurrentPeriodProjectedStats',
fields:() => (
appliedProjectedStatTotal: type:GraphQLFloat
)
);
const CurrentPeriodRealStatsType = new GraphQLObjectType(
name: 'CurrentPeriodRealStats',
fields:() => (
appliedRealStatTotal: type:GraphQLFloat
)
);
const PlayerSlotType = new GraphQLObjectType(
name: 'PlayerSlot',
fields:() => (
pvoRank: type:GraphQLInt,
player:
type: PlayerType
,
watchList: type:GraphQLBoolean,
isKeeper: type:GraphQLBoolean,
isTradeLocked: type:GraphQLBoolean,
currentPeriodProjectedStats:
type: CurrentPeriodProjectedStatsType
,
opponentProTeamId: type:GraphQLInt,
slotCategoryId: type:GraphQLInt,
lockStatus: type:GraphQLInt,
isQueuedWaiverLocked: type:GraphQLBoolean,
currentPeriodRealStats:
type: CurrentPeriodRealStatsType
)
);
const SlotsType = new GraphQLObjectType(
name: 'Slots',
fields:() => (
player0:
type: PlayerSlotType
,
player1:
type: PlayerSlotType
,
player2:
type: PlayerSlotType
,
player3:
type: PlayerSlotType
,
player4:
type: PlayerSlotType
,
player5:
type: PlayerSlotType
,
player6:
type: PlayerSlotType
,
player7:
type: PlayerSlotType
,
player8:
type: PlayerSlotType
,
player9:
type: PlayerSlotType
,
player10:
type: PlayerSlotType
,
player11:
type: PlayerSlotType
,
player12:
type: PlayerSlotType
,
player13:
type: PlayerSlotType
,
player14:
type: PlayerSlotType
,
player15:
type: PlayerSlotType
,
)
);
const DivisionType = new GraphQLObjectType(
name: 'Division',
fields:() => (
divisionName: type:GraphQLString,
divisionId: type:GraphQLInt,
size: type:GraphQLInt
)
);
const TeamType = new GraphQLObjectType(
name: 'Team',
fields:() => (
divisionStanding: type:GraphQLInt,
overallStanding: type:GraphQLInt,
waiverRank: type:GraphQLInt,
division:
type: DivisionType
,
teamAbbrev: type:GraphQLString,
teamNickname: type:GraphQLString,
logoUrl: type:GraphQLString,
teamLocation: type:GraphQLString,
teamId: type:GraphQLInt,
logoType: type:GraphQLString
)
);
const List0Type = new GraphQLObjectType(
name: 'List0',
fields: () => (
slots:
type: SlotsType
,
team:
type: TeamType
,
teamId: type: GraphQLInt,
appliedActiveProjectedTotal: type: GraphQLFloat,
appliedInactiveProjectedTotal: type: GraphQLFloat,
appliedActiveRealTotal: type: GraphQLFloat,
appliedInactiveRealTotal: type: GraphQLFloat,
)
);
const TeamsType = new GraphQLObjectType(
name: 'Teams',
fields: () => (
list0:
type: List0Type
,
list1:
type: List0Type
)
);
// need to define each type individually, working from the bottom up and creating types as needed
const BoxscoreType = new GraphQLObjectType(
name: 'Boxscore',
fields: () => (
teams:
type: TeamsType,
/*resolve(boxscore)
return boxscore.teams;
*/
,
scoringPeriodId:
type: GraphQLInt,
,
matchupPeriodId:
type: GraphQLInt,
,
homeTeamBonus:
type: GraphQLInt,
)
);
const MetadataType = new GraphQLObjectType(
name: 'metadata',
fields:
leagueId: type: GraphQLString,
status: type: GraphQLString,
dateModifiedLeague: type: GraphQLString,
seasonId: type: GraphQLString,
);
const BoxscoreDataType = new GraphQLObjectType(
name: 'BoxscoreData',
fields:
boxscore: type:BoxscoreType,
metadata: type:MetadataType,
,
);
const EspnQuery = new GraphQLObjectType(
name: 'EspnQuery',
fields:
getBoxscore:
type: BoxscoreDataType,
args:
leagueId:
name: 'leagueId',
type: new GraphQLNonNull(GraphQLInt)
,
seasonId:
name: 'seasonId',
type: new GraphQLNonNull(GraphQLInt)
,
teamId:
name: 'teamId',
type: new GraphQLNonNull(GraphQLInt)
,
scoringPeriodId:
name: 'scoringPeriodId',
type: new GraphQLNonNull(GraphQLInt)
,
,
resolve: (obj, leagueId, seasonId, teamId, scoringPeriodId) =>
const url = 'http://games.espn.com/ffl/api/v2/boxscore?leagueId=1150587&seasonId=2017&teamId=5&scoringPeriodId=7'
//const url = 'http://games.espn.com/ffl/api/v2/boxscore?leagueId='+ leagueId + '&seasonId=' + seasonId + '&teamId=' + teamId + '&scoringPeriodId=' + scoringPeriodId
//console.log('leagueId is: ' + leagueId + 'seasonId is: '+seasonId+'teamId is: '+teamId+'scoringPeriodId is: '+scoringPeriodId);
return axios(url)
.then(res => res.data);
,
);
// Keep at the bottom //
module.exports = new GraphQLSchema(
query: EspnQuery
);
我在 Graphiql 中运行的查询是:
getBoxscore(leagueId: 1150587, seasonId: 2017, teamId: 5, scoringPeriodId: 7)
boxscore
teams
list0
slots
player0
player
firstName
不幸的是,它正在回归:
"data":
"getBoxscore":
"boxscore":
"teams":
"list0": null
【问题讨论】:
您有一个庞大的架构,您正试图将它们组合在一起。如果您添加了graphql-tools
包并使用了makeExecutableSchema
,那么编写、阅读和排除故障可能会少很多痛苦。你可以阅读更多here。
【参考方案1】:
您的架构结构与数据结构不匹配。无论何时返回一个数组,您都应该使用GraphQLList
——不需要您添加的ListType
。
例如,如果您查看端点返回的 JSON,teams
是一个数组,而不是一个对象。您已经创建了一个与团队数据结构匹配的 TeamType
,但我们需要告诉 GraphQL teams
将是一个 TeamType
对象的列表(数组),而不仅仅是一个对象。所以我们写:
teams: type: new GraphQLList(TeamsType)
用 GraphQL 模式语言编写,即 [TeamsType]
。 TeamsType 中的大多数字段都是对象或标量。但是,slots
也是一个数组,因此您可以类似地编写:
slots: type: new GraphQLList(SlotsType)
等等。
【讨论】:
以上是关于为啥我的 Graphql 查询返回 null? [复制]的主要内容,如果未能解决你的问题,请参考以下文章