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