Пользовательский объект ошибки с сервером 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, так и для пользовательских ошибок, которые являются машиночитаемыми с помощью этого пакета: