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

https://github.com/thebigredgeek/apollo-errors