如何使用一个查询来解决 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_cents donation 解析器会将您从Splits 解析器返回的对象作为第一个参数,并将所有 GraphQL 参数(包括donation_id)作为第二个参数。 所以从你的描述看来你甚至不需要你的字段中的donation_id参数,因为每个拆分都只有一个捐赠,所以donation_id可以是捐赠解析器的拆分对象的一部分获取作为第一个参数。

以上是关于如何使用一个查询来解决 graphQL 中的多个 Rest 往返?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 在 Django 中的一个请求中进行多个查询

如何使用graphql将mongodb中多个集合中的数据传递到1个反应表

如何在graphql中获取响应中的所有字段而不在查询中传递任何字段名称

如何使用字段作为来自一个 graphql 查询的过滤器来获取位于单独查询中的流体图像?

如何使用 GatsbyJS 和 GraphQL 查询和显示包含多个图像的文件夹

将多个参数传递给 GraphQL 查询