Пользовательский объект ошибки с Apollo Server

Я пытаюсь использовать настраиваемую ошибку с apollo-server, и кажется, что моя настраиваемая ошибка свойство (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) error из formatError?


person ThomasReggi    schedule 19.10.2016    source источник


Ответы (3)


Поскольку Apollo Server использует GraphQL.js, мы можем найти решение, покопавшись здесь: https://github.com/graphql/graphql-js/blob/44f315d1ff72ab32b794937fd11a7f8e792fd873/src/error/GraphLQLEr-L69

По сути, эталонная реализация GraphQL.js улавливает любые ошибки в ваших преобразователях и передает их функции formatError, но при этом помещает их в специальный объект ошибки, специфичный для GraphQL, с такими свойствами, как path, positions и source.

Вы можете найти исходную ошибку, которую вы выбросили из преобразователя, в поле originalError объекта error в formatError, например:

formatError: function (error) {
  console.log(error.originalError.code)
  return error
}
person stubailo    schedule 19.10.2016
comment
почему журнал узлов отличается от graphiql? в graphiql я могу видеть состояния, когда добавляю в formaterror: error.state = error.originalError; но в консоли узла я вижу только: GraphQLError (.. at locationError ..) путь, позиции и источник. могу ли я увидеть в консоли на узле свое свойство состояния? - person stackdave; 18.09.2017

С помощью Apollo вы можете легко мультиплексировать массив ошибок в ответе graphql как для ошибок graphql, так и для пользовательских ошибок, которые машиночитаемы с помощью этого пакета:

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

person Andrew Rhyne    schedule 11.11.2016

Обычно этого достаточно. Вы можете определить код ошибки (2 параметра), сообщение об ошибке и любой настраиваемый объект в расширениях (3 параметра)

     throw new ApolloError('User already exist',
                           'DUPLICATE',
                           { 'session': session })
person Аксенов Владимир    schedule 30.03.2021
comment
Создание ЛЮБОГО ApolloeError или его подкласса всегда будет удалять сообщение и вставлять Unexpected error value: { extensions: { code: <your code> }} вместо , фактически просто передавая ошибку или представляя ошибку как выданную. Сообщение всегда опускается, который побеждает весь процесс использования типа ApolloError, если formatError всегда уничтожает то, что вы действительно хотите выбросить. - person Benjamin R; 22.06.2021