Apollo Server的自定义错误对象

时间:2016-10-19 07:08:51

标签: javascript ecmascript-6 graphql 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)?

3 个答案:

答案 0 :(得分:12)

由于Apollo Server使用GraphQL.js,我们可以通过深入挖掘找到解决方案:https://github.com/graphql/graphql-js/blob/44f315d1ff72ab32b794937fd11a7f8e792fd873/src/error/GraphQLError.js#L66-L69

基本上,GraphQL.js引用实现会捕获解析器中的任何错误,并将它们传递给formatError函数,但它将它们包装在特定的GraphQL特定错误对象中,其属性如path },positionssource

您可以在originalError中的error对象的formatError字段中找到您从解析程序中抛出的原始错误,如下所示:

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

答案 1 :(得分:4)

使用Apollo,您可以轻松地在graphql响应中多路复用错误数组,以解决graphql错误和使用此程序包可读取的自定义错误:

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

答案 2 :(得分:1)

通常就够了。您可以在扩展中定义错误代码(2 个参数)、错误消息和任何自定义对象(3 个参数)

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