出于分析目的,我想跟踪所有graphql操作(包括@client
操作)的客户端。我无法在API中找到合适的选项,并且想知道这是否在apollo客户端级别上可行,或者我是否需要引入一些代理来拦截我自己的调用?
答案 0 :(得分:1)
自定义Apollo链接是一种解决方法。
尤其可以使用apollo-link-logger
将所有操作记录到控制台。
用法(来自文档):
import apolloLogger from 'apollo-link-logger';
// ...
ApolloLink.from([
apolloLogger,
// ...
]);
注意:将apolloLogger
放在其他链接之前。
输出示例:
答案 1 :(得分:1)
因为Yuriy的答案正是我一直在寻找的答案,所以我将其标记为已接受答案-谢谢!
这里仍然要记录的是为我工作的代码-我相信有人可能会发现它有用,而且值得证明它的简单性。
值得注意的是,Apollo链接是可链接的-因此,链接功能的参数为operation: Operation
和forward: NextLink
,应该从我们的链接实现中调用它们。
let analytics: Analytics; // this is Fabric.io Analytics to be provided by DI
const analyticsLink = new ApolloLink((
operation: Operation,
forward?: NextLink
) => {
const operationType = operation.query.definitions[0].operation;
return forward(operation)
.map((result: FetchResult) => {
try {
analytics.sendCustomEvent(`${operationType}.${operation.operationName}`);
} catch (e) {
console.error('analytics error', e);
}
return result;
});
});
作为奖励,我们还可以使用apollo-link-error
来捕获错误(即利用fabric.io crashlytics)(阿波罗中的错误处理稍微复杂一些);
const analyticsErrorLink = onError((error: ErrorResponse) => {
try {
// it's worth to rethink what we wanna log here
const message = error.graphQLErrors ? error.graphQLErrors[0].message :
(error.networkError.name + ': ' + error.networkError.message);
analytics.sendNonFatalCrash('GraphQL error: ' + message);
} catch(e) {
console.error('cannot report error to analytics', e);
}
});
最后要组成链接,我们应该将拦截实现放在开头,这样我们就可以捕获所有GraphQL操作,包括那些未标记为@client
的网络链接-在我的情况下,完整链接看起来喜欢:
ApolloLink.from([
analyticsErrorLink,
analyticsLink,
stateLink,
auth,
http])