Пользовательский объект ошибки с сервером Apollo
Я пытаюсь использовать пользовательскую ошибку с Аполлон-сервера и кажется, что моя пользовательская ошибка имеет свойство (code
), который недоступен изнутри formatError
.
import ExtendableError from 'es6-error'
export default class MyError extends ExtendableError {
constructor(args) {
let code = Object.keys(args)[0]
let message = Object.values(args)[0]
super(message)
this.code = code
}
}
у меня простой обработчик ошибок работает примерно так:
let INVALIDREQUEST = 'invalid request'
let e = new MyError({INVALIDREQUEST})
console.log(e.code) // => "INVALIDREQUEST"
у меня проблемы, потому что, когда я регистрирую error.code
внутри formatError
он недоступен.
formatError: function (error) {
console.log(error.code) // => undefined
return error
}
как я могу распространять пользовательские свойства (например,code
) of error
изнутри formatError
?
2 ответов
потому что сервер Apollo использует GraphQL.js, мы можем найти решение, копая глубоко там: https://github.com/graphql/graphql-js/blob/44f315d1ff72ab32b794937fd11a7f8e792fd873/src/error/GraphQLError.js#L66-L69
по сути, GraphQL.реализация JS reference ловит любые ошибки в ваших решателях и доставляет их в formatError
функция, но она обертывает их в специальный объект ошибки GraphQL с такими свойствами, как path
, positions
, и source
.
вы можете найти исходную ошибку, которую вы бросили из решателя на
с Apollo вы можете легко мультиплексировать массив ошибок в ответе graphql как для ошибок graphql, так и для пользовательских ошибок, которые являются машиночитаемыми с помощью этого пакета: