如果数据不为空,则作为网关运行的Apollo服务器将隐藏远程错误

时间:2019-05-22 13:48:33

标签: graphql apollo apollo-link

我正在运行apollo-server-express作为网关应用程序。使用makeRemoteExecutableSchemaapollo-link-http设置一些基础的GraphQL应用程序。

通常每个电话都可以正常工作。如果错误是响应的一部分,并且数据为null,则它也可以工作。 但是,如果数据仅包含数据,并且错误包含错误。数据将通过,但错误为空

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方法中的

graphQLErrorsonError也包含错误

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

0 个答案:

没有答案