为什么我的Graphql查询返回null?

时间:2017-10-31 20:29:20

标签: javascript express graphql graphql-js graphene-python

我正在尝试为所有人设置一个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
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

架构的结构与数据结构不匹配。如果有返回的数组,您应该使用GraphQLList - 您不需要添加ListType

例如,如果查看端点返回的JSON,teams是一个数组,而不是一个对象。您已经创建了一个与团队数据结构相匹配的TeamType,但我们需要告诉GraphQL teams将成为TeamType个对象的List(数组),不只是一个人。所以我们写道:

teams: { type: new GraphQLList(TeamsType) }

用GraphQL架构语言编写,即[TeamsType]。 TeamsType中的大多数字段都是对象或标量。但是,slots也是一个数组,所以你可以这样写:

slots: { type: new GraphQLList(SlotsType) }

等等。