1

我正在运行一个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并且graphQLErrorsinonError方法也包含错误

{
  "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 值),则响应中的错误条目可能包含执行期间发生的任何错误。如果在执行过程中发生错误,它应该包含这些错误。

4

0 回答 0