Как правильно передать параметры в шаблонный запрос Apollo Client graphql, чтобы l oop и получить все записи? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть этот компонент машинописного обёртки ApolloCLient GraphQl, который корректно работает, как и ожидалось:

import gql from 'graphql-tag'
import ApolloClient from "apollo-client";
import { ApolloLink } from 'apollo-link'
import { HttpLink } from 'apollo-link-http'
import { onError } from 'apollo-link-error'
import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'
import introspectionQueryResultData from '../fragmentTypes.json';

export class GraphQLQueryClient {
    protected apolloClient: any;

    constructor(uri:string) {
        console.log(`Apollo client setup to query uri: ${uri}`);

        const fragmentMatcher = new IntrospectionFragmentMatcher({
            introspectionQueryResultData
        });

        this.apolloClient = new ApolloClient({
            link: ApolloLink.from([
                onError(({ graphQLErrors, networkError }) => {
                    if (graphQLErrors) {
                        graphQLErrors.map((el) =>
                            console.warn(
                                el.message || el
                            )
                        )
                    }
                    if (networkError) console.log(`[Network error]: ${networkError}`)
                }),
                new HttpLink({
                    uri,
                    credentials: 'same-origin',
                })
            ]),
            cache: new InMemoryCache({ fragmentMatcher }),
            // fetchPolicy as network-only avoids using the cache.
            defaultOptions: {
                watchQuery: {
                    fetchPolicy: 'network-only',
                    errorPolicy: 'ignore',
                },
                query: {
                    fetchPolicy: 'network-only',
                    errorPolicy: 'all',
                },
            }
        });
    }

    private async _runQuery(collectionName: string, fields: any, offset: number = 0, limit: number = 100): Promise<any[]> {
        try {
            let totalItems: any[] = [];
            await (async _ => {
                let newItems = [];
                let loopNum = 1;
                do {
                    let query = `{
                                ${collectionName}(limit:${limit}, skip:${offset}){
                                    ${fields}
                                }
                            }`;
                    console.log(`Querying loop number ${loopNum} skip:${offset} limit:${limit}`);
                    // console.log(query);

                    let response = await this.apolloClient.query({ query: gql`${query}` });
                    newItems = response.data[collectionName].items;
                    totalItems = totalItems.concat(newItems);
                    console.log(`totalItems : ${totalItems.length}`);

                    offset = limit * loopNum;
                    loopNum++
                } while (newItems.length >= 100);
            })();
            // console.log(totalItems);
            return totalItems;
        } catch (error) {
            console.log(error);
            return [];
        }
    }

    async getElements() {
        return await this._runQuery('mymodelCollection', `items{
                                                                    title,
                                                                    link
                                                                }`);
    }

}

Поскольку я не эксперт в этом, я считаю, что вышел с наивной реализацией для зацикливания запросов, чтобы получить все записи "modleCollection"

с помощью метода _runQuery. Я написал асин * c -aaait l oop метод, чтобы отобразить все записи из GraphQL по пределу и смещению.

Как вы Я мог бы увидеть, что я строю запрос, программно увеличивая смещение до конца результатов.

Я считаю, что было бы что-то лучше этого через модули ApolloClient и gql

Любой намек на это лучше и кредитное плечо на клиентском модуле Apollo?

...