【问题标题】:Apollo Network (Bad Request) error not caught in apollo-link-errorApollo 网络(错误请求)错误未在 apollo-link-error 中捕获
【发布时间】:2020-03-01 04:38:29
【问题描述】:

发送带有一组错误变量的突变(在这种情况下是故意的)会导致在控制台中抛出错误,并且 apollo-link-error 链接没有发现错误。此外,突变加载状态卡在“正在加载”,而不是错误对象通过。

通过调试会话,我发现 zen-observable 全局错误处理会发现错误链接的“next”函数中抛出的错误,因为未定义“结果”

粘贴了 apollo-link-error 代码,该代码将 observable 包裹在 try catch 中,但此处底部的 catch 不是当 if (result.errors) 抛出“nullpointer”时被命中的 catch,因为导致未定义。


    try {
                    sub = forward(operation).subscribe({
                        next: function (result) {
                            // result is undefined, throwing an error
                            if (result.errors) {
                                retriedResult = errorHandler({
                                    graphQLErrors: result.errors,
                                    response: result,
                                    operation: operation,
                                    forward: forward,
                                });
                                if (retriedResult) {
                                    retriedSub = retriedResult.subscribe({
                                        next: observer.next.bind(observer),
                                        error: observer.error.bind(observer),
                                        complete: observer.complete.bind(observer),
                                    });
                                    return;
                                }
                            }
                            observer.next(result);
                        },
                        error: function (networkError) {
                            retriedResult = errorHandler({
                                operation: operation,
                                networkError: networkError,
                                graphQLErrors: networkError &&
                                    networkError.result &&
                                    networkError.result.errors,
                                forward: forward,
                            });
                            if (retriedResult) {
                                retriedSub = retriedResult.subscribe({
                                    next: observer.next.bind(observer),
                                    error: observer.error.bind(observer),
                                    complete: observer.complete.bind(observer),
                                });
                                return;
                            }
                            observer.error(networkError);
                        },
                        complete: function () {
                            if (!retriedResult) {
                                observer.complete.bind(observer)();
                            }
                        },
                    });
                } // the error is NOT caught here
                catch (e) {
                    errorHandler({ networkError: e, operation: operation, forward: forward });
                    observer.error(e);
                }
    ```

Link definition:
```javascript

    export const client = new ApolloClient({
      link: ApolloLink.from([
        onError((errors) => {
          console.log('errors in link!', errors);
          handleServerError(errors);
        }),
        new MeteorAccountsLink(),
        new HttpLink({
          uri: '/graphql',
        }),
      ]),
      cache: new InMemoryCache(),
    });

编辑: 浏览器中的请求确实显示了带有错误对象的响应,其中 graphQlErro 形状为 {errors: [{..}]},奇怪的是它没有进入链接中的“结果”。

编辑 2:

看起来 Meteor 正在接收在上面发布的错误之前在 http 链接中抛出的错误,这可能是“结果”未定义的原因。编写自定义链接来填充缺失的“结果”,以便应用至少可以正常工作。

【问题讨论】:

    标签: meteor apollo apollo-client graphql-js apollo-boost


    【解决方案1】:

    Meteor 吞下错误似乎是个问题。修复了制作一个 polyfill 链接以至少不会破坏突变完成函数中的 js 并显示一般错误。 const stupidMeteorErorrPolyfill = new ApolloLink((operation, forward) => forward(operation).map(data => data || { errors: [{ message: '! Empty response in gql links, see graphql.js and network tab' }] }));

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 2020-04-08
      • 2022-01-25
      • 2018-07-30
      • 2018-05-11
      • 2021-10-03
      • 2017-11-20
      • 2018-05-15
      • 2019-03-17
      相关资源
      最近更新 更多