如何将现有的json转换为GraphQL端点?

如何将现有的json转换为GraphQL端点?,json,node.js,express,graphql,graphql-js,Json,Node.js,Express,Graphql,Graphql Js,我正在创建一个从api接收数据的应用程序,我需要轻松访问远程数据。目前,我的游戏计划是在用户需要数据时从端点下载json文件,但如果有人能推荐一种将远程url用作GraphQL源的方法,我也会很感激 关于手头的问题: 我不确定应该如何构造schema.js文件。这是我试图使用的实际数据 但这里有一个粗略的轮廓,我把它放在一起。它或多或少概述了我在访问时遇到困难的所有嵌套字典和列表。如果有人能给我举几个例子,说明如何使用这些嵌套的dict、list和value,我将不胜感激 { boxscore

我正在创建一个从api接收数据的应用程序,我需要轻松访问远程数据。目前,我的游戏计划是在用户需要数据时从端点下载json文件,但如果有人能推荐一种将远程url用作GraphQL源的方法,我也会很感激

关于手头的问题:

我不确定应该如何构造schema.js文件。这是我试图使用的实际数据

但这里有一个粗略的轮廓,我把它放在一起。它或多或少概述了我在访问时遇到困难的所有嵌套字典和列表。如果有人能给我举几个例子,说明如何使用这些嵌套的dict、list和value,我将不胜感激

{
boxscore {
  progames {
  },
teams {
  [
    slots {

    },
    appliedStats : float,
    appliedStats1: float,
    team {
      [
        rank: int,
        player {

        },
        watch: boolean,
        trade: boolean,
        currentProjStats {

        },
        proGameIds {

        }
      ],
      [
        ...
      ],
      [
        ...
      ],
    },
    teamId: int,
    appliedActive: int,
    appliedProjActive: float,
  ],
  [

  ]
  }
 }
}
下面是我尝试的一个例子

常数{ GraphQLObjectType, 图形字符串, GraphQLInt, 图形模式, 图表列表, GraphQLNonNull, GraphQLBoolean, 石墨浮球 }=需要“graphql”; const axios=需要“axios”; const PlayerType=新的GraphQLObjectType{ 姓名:'玩家', 字段:=>{ 可拖放:{type:GraphQLBoolean}, 百分比开始:{type:GraphQLFloat}, 泽西:{type:GraphQLString}, playerRatingSeason:{type:GraphQLFloat}, positionRank:{type:GraphQLInt}, ISiregible:{type:GraphQLBoolean}, draftRank:{type:GraphQLInt}, 值:{type:GraphQLInt}, universeId:{type:GraphQLInt}, 名字:{type:GraphQLString}, ElligibleslotscategoryId:{type:ElligibleslotscategorydType}, GameStarter状态:{type:GraphQLInt}, 姓氏:{type:GraphQLString}, sportsId:{type:GraphQLInt}, healthStatus:{type:GraphQLInt}, percentOwned:{type:GraphQLFloat}, 蛋白质胺:{type:GraphQLInt}, tickerId:{type:GraphQLInt}, isActive:{type:GraphQLBoolean}, playerId:{type:GraphQLInt}, 百分比更改:{type:GraphQLFloat}, defaultPositionId:{type:GraphQLInt}, 总计点:{type:GraphQLFloat} } }; const CurrentPeriodProjectedStatsType=新图形QLObjectType{ 名称:“CurrentPeriodProjectedStats”, 字段:=>{ appliedProjectedStatTotal:{type:GraphQLFloat}, } }; const ProGameIdsType=新的GraphQLObjectType{ 名称:'ProGameIds', 字段:=>{ id:{type:GraphQLInt}, } }; const CurrentPeriodRealStatsType=新图形QLObjectType{ 名称:“CurrentPeriodRealStats”, 字段:=>{ appliedRealStatTotal:{type:GraphQLFloat}, } }; const SlotsType=新的GraphQLObjectType{ 名称:“插槽”, 字段:=>{ //这可能采用类型:graphqlist,但不确定// pvoRank:{type:GraphQLInt}, 播放器:{type:PlayerType}, 监视列表:{type:GraphQLBoolean}, isKeeper:{type:GraphQLBoolean}, isTradeLocked:{type:GraphQLBoolean}, currentPeriodProjectedStats:{type:currentPeriodProjectedStats}, proGameIds:{type:proGameIds}, 对映体蛋白:{type:GraphQLInt}, slotCategoryId:{type:GraphQLInt}, 锁定状态:{type:GraphQLInt}, isQueuedWaiverLocked:{type:GraphQLBoolean}, currentPeriodRealStats:{type:CurrentPeriodRealStatsType} } }; /* const ProgamesType=新的GraphQLObjectType{ 名称:“Progames”, 字段:=>{ } }; */ const TeamsType=新的GraphQLObjectType{ 名称:'团队', 字段:{ 第1组:{type:graphqlist}, 第2组:{type:graphqlist}, } }; const-BoxscoreType=新的GraphQLObjectType{ 名称:“Boxscore”, 字段:=>{ //progames:{type:ProgamesType}, 团队:=>GraphQLListTeamsType, scoringPeriodId:{type:GraphQLInt}, MatchUpperIdID:{type:GraphQLInt}, homeTeamBonus:{type:GraphQLInt} } }; 常量MetadataType=新的GraphQLObjectType{ 名称:'元数据', 字段:=>{ leagueId:{type:GraphQLString}, 状态:{type:GraphQLString}, 季节ID:{type:GraphQLString} } }; const EspnQuery=新的GraphQLObjectType{ 名称:“EspQueryType”, 字段:{ boxscore:{type:BoxscoreType}, }, resolveparentValue,args{ } }; //守口如瓶// module.exports=新的GraphQLSchema{ 查询:EspnQuery
}; 我在代码中看到的最大问题是,您正在尝试为Query-esquery添加一个解析器。即使它被定义为GraphQLObjectType,因为它位于根目录下,它的解析器永远不会被调用。您要做的是将现有的数据结构包装到esquery的某个字段中:

出于测试目的,您可以将示例JSON数据放在单独的文件中,只需:

这将返回一个对象,您可以在getBoxscore查询的解析器中返回该对象

但我们希望从API调用返回数据,因此让我们改为:

resolve: () => {
  const url = 'http://games.espn.com/ffl/api/v2/boxscore?leagueId=1150587&seasonId=2017&teamId=5&scoringPeriodId=7'
  return axios(url)
}
Axios返回一个承诺,这很好,因为我们的解析器可以返回一个值,也可以返回一个将在该值中解析的承诺。只要确保你不会忘记退货

好处:使用参数 您还可以为任何字段定义参数,然后可以在解析器中使用这些参数。那就去吧 看起来像这样:

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=${leageId}&seasonId=${seasonId}&teamId=${teamId}&scoringPeriodId=${scoringPeriodId}`
    return axios(url)
  }
}
resolve: ({ player: { playerId } }) => {
    const url = `some url that uses that ${playerId}`
    return axios(url)
}
奖金2:解析器 另外,别忘了让GraphQL如此强大的部分原因是它能够在字段级别处理数据的返回方式。因此,对于任何字段,您都可以在将父对象返回到客户机之前轻松地操作它返回的数据

一个愚蠢的例子可能是在PlayerType中的firstName上附加解析程序:

resolve: ({ firstName }) => {
  return firstName.toUpperCase()
}
更有趣的用法可能是对不同的API端点进行额外调用。例如,对于SlotsType上的播放器字段,可以附加如下解析程序:

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=${leageId}&seasonId=${seasonId}&teamId=${teamId}&scoringPeriodId=${scoringPeriodId}`
    return axios(url)
  }
}
resolve: ({ player: { playerId } }) => {
    const url = `some url that uses that ${playerId}`
    return axios(url)
}
当然,如果您这样做了,您可能还会修改PlayerType以反映该调用返回的数据


有很多可能性值得探索。祝你好运

谢谢大家!!这太完美了!我有另一个问题,但这很可能是由于我的graphql noob。我可以给你留言寻求帮助吗?我会在接下来的6个小时里断断续续的。请随意在这里向我提问:
resolve: ({ player: { playerId } }) => {
    const url = `some url that uses that ${playerId}`
    return axios(url)
}