angular, apollo-client, graphQL - Выбрать все поля из запроса graphql

Я запрашиваю службу graphql с помощью apollo-client и angular4, давая ей имена полей, которые я хочу получить с помощью массива, который также может быть нулевым. Если поля массива имеют значение 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;
  }

// ...

заранее спасибо


person Christoph Glaß    schedule 28.09.2017    source источник


Ответы (1)


Вы можете сначала запросить все поля и использовать результат для запроса всех полей:

{ __type(name:"Person") {
    fields {
      name
      }  
    }
}
person Reto Aebersold    schedule 10.11.2017
comment
Спасибо за ответ, но что делать, если я не знаю названия всех полей? - person Christoph Glaß; 05.12.2017
comment
Этот запрос дает вам все имена полей типа Person. - person Reto Aebersold; 08.12.2017
comment
Но разве это не дорого? - person gtzinos; 04.04.2020