angular, apollo-client, graphQL - 从 graphql 查询中选择所有字段

Posted

技术标签:

【中文标题】angular, apollo-client, graphQL - 从 graphql 查询中选择所有字段【英文标题】:angular, apollo-client, graphQL - Select all fields from a graphql query 【发布时间】:2018-03-10 05:32:34 【问题描述】:

我使用 apollo-client 和 angular4 查询一个 graphql 服务,为它提供我想通过一个也可以为空的数组检索的字段名。如果 Array fields 为 null,我希望我的客户端返回 graphQL 方法可用的所有字段名。现在我必须手写它们。是否可以默认选择所有字段名?

或者我的代码完全不好,并且有一些最佳实践来处理动态 graphql 查询?

示例如下:

//...

function fieldsToModel(fields: Array<any>, output: string): string 

  for (const field in fields) 

    if (typeof fields[field] !== 'object') 
      output += fields[field].toString() + ',';
     else 
      if (Object.keys(fields[field])[0] !== undefined) 
        output += Object.keys(fields[field])[0] + '' + fieldsToModel(fields[field][Object.keys(fields[field])[0]], '') + ',';
      
    
  

  return output;


// ...

public GetPersons(
    personId: number, repId: number, fields: Array<any> = null): Observable<PersonModel> 

    fields = fields !== null ? fields : [
      'id', '', 'firstname', 'repId', 'lastname', 'sex',
       'adress': ['street', 'zip', 'city'] ,'birthday'];

    const head: String = `query GetPersons($repId:String, $personId:String, $Token:String) 
     viewer  GetPersons(repId: $repId, personId: $personId, Token: $Token) `;
    let body = '';
    body = fieldsToModel(fields, body);
    const foot: String = '';
    const query = head + body + foot;

    return this._apollo.watchQuery<any>(
      query: gql`$query`,
      variables: 
        repID: Id.toString(),
        personId: personId.toString(),
        Token: environment.Secret
      ,
    )
      .map(result => this._processGetPerson(result))
      .catch((response_: any) => 
        try 
          return this._processGetPerson(response_);
         catch (e) 
          return <Observable<PersonModel>><any>Observable.throw(e);
        
      );
  

  private _processGetPerson(result: any): any 
    if (result.graphQLErrors) 
      return Observable.throw(result);
    

    const person = new PersonModel();
    if (result.data && result.data.viewer && result.data.viewer.GetPerson) 
      person.init(result.data.viewer.GetPerson);
    
    return person;
  

// ...

提前谢谢你

【问题讨论】:

【参考方案1】:

您可以先查询所有字段,然后使用结果查询所有字段:

 __type(name:"Person") 
    fields 
      name
        
    

【讨论】:

感谢您的回答。但是如果我不知道所有字段的名称怎么办? 此查询为您提供Person 类型的所有字段名称。 但这不是很贵吗?

以上是关于angular, apollo-client, graphQL - 从 graphql 查询中选择所有字段的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将服务注入 apollo-client 的中间件?

使用 GraphQL 的 Angular2 服务和路由解析器

如何为 apollo-client 的每个请求设置变量?

如何将 localStorage 与 apollo-client 和 reactjs 一起使用?

设置 apollo-client 标头时出现 NetworkError

apollo.watchQuery 堆栈/重复 = 性能问题?