У меня есть приложение-ответ, которое имеет клиент GraphQL для получения контента с моего сервера на Heroku.
Вот так выглядит мой клиент GraphQL в приложении:
// API_ENDPOINT: https://my-app.herokuapp.com
const httpLink = new HttpLink({ uri: config.API_ENDPOINT });
const authLink = setContext((_, { headers }) => ({
headers: {
...headers,
'x-api-key': config.API_TOKEN,
},
}));
const errorLink = onError(({ operation, response, graphQLErrors, networkError }) => {
if (graphQLErrors) {
graphQLErrors.forEach(({ message, locations, path, code }: any) => {
errorLog(
`GraphQL error, operation: ${operation.operationName}, variables: ${JSON.stringify(
operation.variables,
)}, message: ${JSON.stringify(message)}, location: ${JSON.stringify(locations)}, path: ${JSON.stringify(
path,
)}, code: ${JSON.stringify(code)}`,
);
});
}
if (networkError) {
errorLog(
`Network error, error: ${networkError}, operation: ${operation.operationName}, variables: ${JSON.stringify(
operation.variables,
)}, response: ${JSON.stringify(response)}, code: ${JSON.stringify(
get(networkError, 'statusCode'),
)}, graphqlerrors: ${JSON.stringify(graphQLErrors)}`,
);
}
});
const link = ApolloLink.from([errorLink, authLink, httpLink]);
const cache = new InMemoryCache();
export const client = new ApolloClient({
link,
cache,
defaultOptions: {
query: {
errorPolicy: 'ignore',
},
},
});
затем, чтобы извлечь данные и сохранить их на пользовательском устройстве, я использую mobx-state-tree
, это выглядит так:
fetch: flow(function* fetch(): any {
self.isLoading = true;
const { data, loading } = yield client.query({
query: QUERY,
fetchPolicy: 'network-only',
});
if (!data) {
self.isLoading = false;
return;
}
try {
self.now = NowModel.create(data);
} catch (e) {
errorLog(`Cannot create NowModel: ${e}, ${JSON.stringify(now)}`);
}
self.isLoading = loading;
}),
Хорошо, это было введение, давайте поговорим о проблеме сейчас.
Я пробовал приложение на нескольких устройствах в режиме выпуска, и у меня не было никаких проблем. Я использую Sentry для получения отчетов о проблемах, и я получил много ошибок, связанных с проблемами сети (и с другими запросами):
Network error, error: TypeError: Network request failed, operation: myQuery, variables: undefined, response: undefined, code: undefined, graphqlerrors: undefined
Я также проверил журналы на сервере, и у меня нетна любые проблемы или ошибки в запросах все они отвечают со статусом 200.
Я подозреваю, что это может быть связано с fetchPolicy: 'network-only'
или errorPolicy: 'ignore'
, не будучи уверенным. Может ли быть так, что когда приложение переходит в фоновое состояние пользовательского устройства, оно переходит в странное состояние для клиента graphql? или может быть, что пользователь пытается загрузить данные, когда он не подключен к Интернету?
заранее спасибо,