• Stars
    star
    408
  • Rank 105,946 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 8 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Machine-readable custom errors for Apollostack's GraphQL server

apollo-errors

Machine-readable custom errors for Apollostack's GraphQL server

NPM

CircleCI

Example from Apollo Day

Authentication and Error Handling in GraphQL

Installation and usage

Install the package:

npm install apollo-errors

Create some errors:

import { createError } from 'apollo-errors';

export const FooError = createError('FooError', {
  message: 'A foo error has occurred'
});

Hook up formatting:

import express from 'express';
import bodyParser from 'body-parser';
import { formatError } from 'apollo-errors';
import { graphqlExpress } from 'apollo-server-express';
import schema from './schema';

const app = express();

app.use('/graphql',
  bodyParser.json(),
  graphqlExpress({
    formatError,
    schema
  })
);

app.listen(8080)

Throw some errors:

import { FooError } from './errors';

const resolverThatThrowsError = (root, params, context) => {
  throw new FooError({
    data: {
      something: 'important'
    },
    internalData: {
      error: `The SQL server died.`
    }
  });
}

Witness glorious simplicity:

POST /graphql (200)

{
  "data": {},
  "errors": [
    {
      "message":"A foo error has occurred",
      "name":"FooError",
      "time_thrown":"2016-11-11T00:40:50.954Z",
      "data":{
        "something": "important"
      }
    }
  ]
}

The internalData property is meant for data you want to store on the error object (e.g. for logging), but not send out to your end users. You can utilize this data for logging purposes.

import { isInstance as isApolloErrorInstance, formatError as formatApolloError } from 'apollo-errors';

function formatError(error) {
  const { originalError } = error;
  if (isApolloErrorInstance(originalError)) {
    // log internalData to stdout but not include it in the formattedError
    console.log(JSON.stringify({
      type: `error`,
      data: originalError.data,
      internalData: originalError.internalData
    }));
  }
  return formatApolloError(error)
}

API

ApolloError ({ [time_thrown: String, data: Object, internalData: object, message: String ]})

Creates a new ApolloError object. Note that ApolloError in this context refers to an error class created and returned by createError documented below. Error can be initialized with a custom time_thrown ISODate (default is current ISODate), data object (which will be merged with data specified through createError, if it exists), internalData object (which will be merged with internalData specified trough createError) and message (which will override the message specified through createError).

createError(name, {message: String, [data: Object, internalData: object, options: Object]}): ApolloError

Creates and returns an error class with the given name and message, optionally initialized with the given data, internalData and options. data and internalData passed to createError will later be merged with any data passed to the constructor.

Options (default):

  • showPath (false): Preserve the GraphQLError path data.
  • showLocations (false): Preserve the GraphQLError locations data.

formatError (error, strict = false): ApolloError|Error|null

If the error is a known ApolloError, returns the serialized form of said error.

Otherwise, if strict is not truthy, returns the original error passed into formatError.

Otherwise, if strict is truthy, returns null.

isInstance (error): Boolean

Returns true if the error is an instance of an ApolloError. Otherwise, returns false

More Repositories

1

apollo-resolvers

Expressive and composable resolvers for Apollostack's GraphQL server
JavaScript
433
star
2

microlock

A dead simple distributed locking library for Node.js and Etcd
JavaScript
93
star
3

angular-rison

Rison URL Object encoding service for Angular. Encode infinite-depth javascript objects into a url-friendly string
JavaScript
14
star
4

solaris

A minimalistic framework for building GraphQL-powered backends
8
star
5

talk-apollo-day-04-12-2017

Demo code from Apollo Day 04-12-2017
JavaScript
6
star
6

gatsby-preview-sanity

Sanity CMS with Gatsby Preview
JavaScript
6
star
7

opengraph-scraper

A scraper for open graph meta-data
JavaScript
6
star
8

grunt-init-angular-app

A Grunt Scaffold for Angular Applications
JavaScript
5
star
9

dcbg

Simple command line tool to resolve the next active target code for blue/green deployments on docker cloud
JavaScript
4
star
10

cognac

A lightweight framework for building event-driven cloud native services
TypeScript
3
star
11

bower-twilio

Twilio JavaScript SDK for Bower
JavaScript
2
star
12

slush-node-microservice

Node Microservice scaffold for Slush
JavaScript
2
star
13

elixir-learnings

1
star
14

python-learnings

1
star
15

sendgridjs

Functional Sendgrid API for NodeJS
1
star
16

angular-lodash

Lodash injectable for AngularJS
JavaScript
1
star
17

injectorator

Minimial decorator-based dependency injection library for NodeJS and the Browser
JavaScript
1
star
18

grunt-init-angular-module

A Grunt Scaffold for Angular Modules
JavaScript
1
star
19

grunt-init-ng-component

Angular Module Scaffold for GruntJS
JavaScript
1
star
20

grunt-init-angular-coffee-haml-app

Grunt Scaffold for Angular Applications using CoffeeScript and HAML
JavaScript
1
star