Apollo Server的自定义错误对象

Tho*_*ggi 7 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
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个简单的错误处理程序工作原理如下:

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

我遇到了麻烦,因为当我error.code从内部登录时,formatError它无法使用.

formatError: function (error) {
  console.log(error.code) // => undefined
  return error
}
Run Code Online (Sandbox Code Playgroud)

如何从内部传播自定义属性(如code)?errorformatError

stu*_*ilo 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.

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

formatError: function (error) {
  console.log(error.originalError.code)
  return error
}
Run Code Online (Sandbox Code Playgroud)


And*_*yne 5

使用 Apollo,您可以轻松地在 graphql 响应中为 graphql 错误和使用此包机器可读的自定义错误多路复用错误数组:

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