在apollo客户端中,我如何能够记录或拦截所有操作(查询和突变)

时间:2018-10-11 22:48:41

标签: apollo apollo-client

出于分析目的,我想跟踪所有graphql操作(包括@client操作)的客户端。我无法在API中找到合适的选项,并且想知道这是否在apollo客户端级别上可行,或者我是否需要引入一些代理来拦截我自己的调用?

2 个答案:

答案 0 :(得分:1)

自定义Apollo链接是一种解决方法。

尤其可以使用apollo-link-logger将所有操作记录到控制台。

用法(来自文档):

import apolloLogger from 'apollo-link-logger';

// ...
ApolloLink.from([
  apolloLogger,
  // ...
]);

注意:将apolloLogger放在其他链接之前。

输出示例:

enter image description here

答案 1 :(得分:1)

因为Yuriy的答案正是我一直在寻找的答案,所以我将其标记为已接受答案-谢谢!

这里仍然要记录的是为我工作的代码-我相信有人可能会发现它有用,而且值得证明它的简单性。

值得注意的是,Apollo链接是可链接的-因此,链接功能的参数为operation: Operationforward: 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])