ThomasReggi
ThomasReggi

Reputation: 59475

Custom Error Object with Apollo Server

I'm trying to use a custom error with apollo-server and it seems that my custom error has a property (code) that isn't available from within 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
  }
}

I have a simple error handler works something like this:

let INVALIDREQUEST = 'invalid request'
let e = new MyError({INVALIDREQUEST})
console.log(e.code) // => "INVALIDREQUEST"

I'm having trouble because when I log error.code from within formatError it's not available.

formatError: function (error) {
  console.log(error.code) // => undefined
  return error
}

How can I propagate custom properties (like code) of error from within formatError?

Upvotes: 11

Views: 11295

Answers (3)

Aksenov Vladimir
Aksenov Vladimir

Reputation: 707

Usually it's enough. You can define error code (2 parameter), error message and any custom object in extensions (3 parameter)

     throw new ApolloError('User already exist',
                           'DUPLICATE',
                           { 'session': session })

Upvotes: 1

Andrew Rhyne
Andrew Rhyne

Reputation: 5090

With Apollo, you can easily multiplex the errors array in the graphql response for both graphql errors AND custom errors that are machine readable using this package:

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

Upvotes: 5

stubailo
stubailo

Reputation: 6147

Because Apollo Server uses GraphQL.js, we can find the solution by digging deep there: https://github.com/graphql/graphql-js/blob/44f315d1ff72ab32b794937fd11a7f8e792fd873/src/error/GraphQLError.js#L66-L69

Essentially, the GraphQL.js reference implementation catches any errors in your resolvers, and delivers them to the formatError function, but it wraps them in a special GraphQL-specific error object, with properties like path, positions, and source.

You can find the original error you threw from the resolver on the originalError field of the error object in formatError, like so:

formatError: function (error) {
  console.log(error.originalError.code)
  return error
}

Upvotes: 14

Related Questions