-
-
Save mjurincic/304c981deb30db6f34bdc4380b2bc997 to your computer and use it in GitHub Desktop.
GraphQL error tracking with sentry.io
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable no-console, import/first */ | |
import path from 'path'; | |
import express from 'express'; | |
import expressStaticGzip from 'express-static-gzip'; | |
import graphqlHTTP from 'express-graphql'; | |
import PrettyError from 'pretty-error'; | |
import bodyParser from 'body-parser'; | |
import raven from 'raven'; | |
import morgan from 'morgan'; | |
import { graphqlBatchHTTPWrapper } from 'react-relay-network-layer'; | |
import { PORT, PUBLIC_URL } from 'config'; | |
import GraphQLSchema from 'schema'; | |
import * as myJWT from 'app/auth/_jwt'; | |
import serverRenderHtml from './serverRenderHtml'; | |
const pe = new PrettyError(); | |
pe.skipNodeFiles(); | |
pe.skipPackage('express', 'graphql'); | |
raven.config(!__DEV__ && 'https://secret1:[email protected]/1234567', { | |
release: __REVISION__, | |
tags: { git_commit: __GIT_COMMIT__ }, | |
environment: process.env.NODE_ENV, | |
}).install(); | |
const server = express(); | |
server.use(raven.requestHandler()); | |
server.use(morgan(__DEV__ ? 'dev' : 'combined')); | |
const graphQLMiddleware = graphqlHTTP(req => ({ | |
schema: GraphQLSchema, | |
graphiql: true, | |
formatError: (error) => { | |
if (error.path || error.name !== 'GraphQLError') { | |
console.error(pe.render(error)); | |
raven.captureException(error, | |
raven.parsers.parseRequest(req, { | |
tags: { graphql: 'exec_error' }, | |
extra: { | |
source: error.source && error.source.body, | |
positions: error.positions, | |
path: error.path, | |
}, | |
}) | |
); | |
} else { | |
console.error(pe.render(error.message)); | |
raven.captureMessage(`GraphQLWrongQuery: ${error.message}`, | |
raven.parsers.parseRequest(req, { | |
tags: { graphql: 'wrong_query' }, | |
extra: { | |
source: error.source && error.source.body, | |
positions: error.positions, | |
}, | |
}) | |
); | |
} | |
return { | |
message: error.message, | |
stack: process.env.NODE_ENV === 'development' ? error.stack.split('\n') : null, | |
}; | |
}, | |
context: { | |
userId: req.userId, | |
userEmail: req.userEmail, | |
admin: req.admin, | |
getUserPromise: req.getUserPromise ? req.getUserPromise.bind(req) : null, | |
getAdminPromise: req.getAdminPromise ? req.getAdminPromise.bind(req) : null, | |
ip: req.ip || (req.connection || {}).remoteAddress, | |
}, | |
})); | |
server.use('/graphql/batch', | |
myJWT.validateRequest, | |
bodyParser.json(), | |
graphqlBatchHTTPWrapper(graphQLMiddleware) | |
); | |
server.use('/graphql', | |
myJWT.validateRequest, | |
graphQLMiddleware | |
); | |
server.use(expressStaticGzip(path.join(__dirname, 'public'))); | |
server.get('/*', serverServeApp); | |
// Error handling | |
server.use((err, req, res, next) => { // eslint-disable-line no-unused-vars | |
console.log(pe.render(err)); // eslint-disable-line no-console | |
res.status(err.status || 500); | |
res.setHeader('Content-Type', 'text/plain'); | |
res.send(__DEV__ ? err.stack : 'Oops, internal server error'); | |
}); | |
server.listen(PORT, () => { | |
console.log(`The server is running at http://localhost:${PORT}/`); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment