我正在运行apollo-server-express
作为网关应用程序。使用makeRemoteExecutableSchema
和apollo-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
}
查询
mutation inviteByEmail {
invite(email: "invalid!!!~~~test!--@example.com") {
status
}
}
来自远程服务(httpLink)的响应
response.errors
方法中的 graphQLErrors
和onError
也包含错误
{
"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),则响应中的错误条目可能包含在执行期间发生的任何错误。如果执行期间发生错误,则应包含这些错误。