我正在运行一个apollo-server-express
作为网关应用程序。makeRemoteExecutableSchema
使用和设置一些底层 GraphQL 应用程序apollo-link-http
。
通常每个电话都可以正常工作。如果错误是响应的一部分并且数据为空,它也可以工作。但是如果数据只包含数据并且错误包含错误。数据将通过但错误为空
const headerSet = setContext((request, previousContext) => {
return setHeaders(previousContext);
});
const errorLink = onError(({ response, forward, operation, graphQLErrors, networkError }) => {
if (graphQLErrors) {
graphQLErrors.map((err) => {
Object.setPrototypeOf(err, Error.prototype);
});
}
if (networkError) {
logger.error(networkError, 'A wild network error appeared');
}
});
const httpLink = new HttpLink({
uri: remoteURL,
fetch
});
const link = headerSet.concat(errorLink).concat(httpLink);
示例 A“工作示例”:
询问
{
checkName(name: "namethatistoolooooooong")
}
查询响应
{
"errors": [
{
"message": "name is too long, the max length is 20 characters",
"path": [
"checkName"
],
"extensions": {
"code": "INPUT_VALIDATION_ERROR"
}
}
],
"data": null
}
示例 B“隐藏的错误”:
询问
mutation inviteByEmail {
invite(email: "invalid!!!~~~test!--@example.com") {
status
}
}
来自远程服务的响应 (httpLink)
response.errors
并且graphQLErrors
inonError
方法也包含错误
{
"errors": [
{
"message": "Email not valid",
"path": [
"invite"
],
"extensions": {
"code": "INPUT_VALIDATION_ERROR"
}
}
],
"data": {
"invite": {
"status": null
}
}
}
回复
{
"data": {
"invite": {
"status": null
}
}
}
根据graphql规范,如果错误对象是响应的一部分,我会期望它不会被隐藏
https://graphql.github.io/graphql-spec/June2018/#sec-Errors
如果响应中的数据条目存在(包括它是否为 null 值),则响应中的错误条目可能包含执行期间发生的任何错误。如果在执行过程中发生错误,它应该包含这些错误。