我尝试使用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
)?
答案 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
},positions
和source
。
您可以在originalError
中的error
对象的formatError
字段中找到您从解析程序中抛出的原始错误,如下所示:
formatError: function (error) {
console.log(error.originalError.code)
return error
}
答案 1 :(得分:4)
使用Apollo,您可以轻松地在graphql响应中多路复用错误数组,以解决graphql错误和使用此程序包可读取的自定义错误:
答案 2 :(得分:1)
通常就够了。您可以在扩展中定义错误代码(2 个参数)、错误消息和任何自定义对象(3 个参数)
throw new ApolloError('User already exist',
'DUPLICATE',
{ 'session': session })