如何使用一个查询来解决 graphQL 中的多个 Rest 往返?
Posted
技术标签:
【中文标题】如何使用一个查询来解决 graphQL 中的多个 Rest 往返?【英文标题】:How can I use one query to resolve many Rest round trips in graphQL? 【发布时间】:2017-01-10 23:16:35 【问题描述】:我正在尝试使用 GraphQL 和 Apollo 解决 REST 查询。
我的休息数据是这样的
将基金 ID 传递给一个拆分解析器,它返回一个 -> [拆分数组] -> 每个拆分都有一个捐赠 ID -> 我想使用该 ID 从单独的休息端点获取 donation 对象
这是我的架构
export const schema = [`
schema
query: RootQuery
type RootQuery
Splits(id: Int!): [Splits]
type Splits
amount_in_cents:Int
donation_id:Int
fund_id:Int
id:Int
memo:String
donation(donation_id: Int): Donation
type Donation
amount_in_cents: Int
bank_name: String
`];
这是我的解析器文件
import rp from 'request-promise';
const DTBaseURL = 'https://restendpointdomainhere.com/';
const getFromDT = (getQuery) =>
const data = rp( DTBaseURL + getQuery,
'auth':
"user": Meteor.settings.endpoint.user,
"pass": Meteor.settings.endpoint.pass,
)
.then( ( res ) => JSON.parse( res ) )
.then((res) =>
return res;
);
return data;
;
export default resolveFunctions =
RootQuery:
Splits( root, args, context )
let newValue = [];
const getQuery = 'funds/' + args.id + '/splits.json';
const data = getFromDT(getQuery)
.then( ( res ) =>
res.forEach( function ( donationSplit )
newValue.push( donationSplit.split );
);
return newValue;
);
return data;
,
donation( root, args, context )
console.log( args );
const getQuery = 'donations/' + args.donation_id + '.json';
const data = getFromDT(getQuery)
.then((res) =>
return res.donation;
);
return data;
;
我所做的任何查询 @ /graphql 都会收到此错误消息。
"errors": [
"message": "Resolve function missing for \"Splits.donation\""
]
感谢您提供任何帮助。
【问题讨论】:
【参考方案1】:您似乎正在使用 graphql-tools 来创建您的架构。此错误消息告诉您无法成功构建架构,因为Splits
上的donation
字段需要解析函数。你定义了 resolve 函数,但是你把它放在了 RootQuery
而不是 Splits
它所属的地方:
export default resolveFunctions =
RootQuery:
Splits( root, args, context )
let newValue = [];
const getQuery = 'funds/' + args.id + '/splits.json';
const data = getFromDT(getQuery)
.then( ( res ) =>
res.forEach( function ( donationSplit )
newValue.push( donationSplit.split );
);
return newValue;
);
return data;
,
,
Splits: // <<---- you forgot this ------
donation( root, args, context )
console.log( args );
const getQuery = 'donations/' + args.donation_id + '.json';
const data = getFromDT(getQuery)
.then((res) =>
return res.donation;
);
return data;
,
;
【讨论】:
谢谢。现在如何允许donation_id 从查询响应传递到这个解析器?这是我在 GraphiQL Splits(id: 71455) amount_in_centsdonation_iddonation(donation_id:donation_id) amount_in_centsdonation
解析器会将您从Splits
解析器返回的对象作为第一个参数,并将所有 GraphQL 参数(包括donation_id)作为第二个参数。
所以从你的描述看来你甚至不需要你的字段中的donation_id参数,因为每个拆分都只有一个捐赠,所以donation_id可以是捐赠解析器的拆分对象的一部分获取作为第一个参数。以上是关于如何使用一个查询来解决 graphQL 中的多个 Rest 往返?的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 在 Django 中的一个请求中进行多个查询
如何使用graphql将mongodb中多个集合中的数据传递到1个反应表
如何在graphql中获取响应中的所有字段而不在查询中传递任何字段名称
如何使用字段作为来自一个 graphql 查询的过滤器来获取位于单独查询中的流体图像?