У меня есть этот компонент машинописного обёртки 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?