Apollo 网络(错误请求)错误未在 apollo-link-error 中捕获
Posted
技术标签:
【中文标题】Apollo 网络(错误请求)错误未在 apollo-link-error 中捕获【英文标题】:Apollo Network (Bad Request) error not caught in 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 链接中抛出的错误,这可能是“结果”未定义的原因。编写自定义链接来填充缺失的“结果”,以便应用至少可以正常工作。
【问题讨论】:
【参考方案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' ] ));
【讨论】:
以上是关于Apollo 网络(错误请求)错误未在 apollo-link-error 中捕获的主要内容,如果未能解决你的问题,请参考以下文章
react-apollo 错误:[网络错误]:ServerParseError:JSON.parse:JSON 数据第 1 行第 1 列的意外字符
如何从 graphql apollo 客户端查询中获取/记录/捕获错误