发送带有一组错误变量的突变(在这种情况下是故意的)会导致在控制台中抛出错误,并且 apollo-link-error 链接没有发现错误。此外,突变加载状态被卡为“加载”,而不是错误对象出现。
通过调试会话,我发现 zen-observable 全局错误处理会发现错误链接的“下一个”函数中抛出的错误,因为未定义“结果”
粘贴了 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 链接中抛出的错误,这可能是“结果”未定义的原因。编写一个自定义链接来填充缺失的“结果”,这样应用程序至少可以工作。