【问题标题】:How to Only Catch non-ApolloError Errors with Apollo GraphQL Server如何使用 Apollo GraphQL Server 仅捕获非 ApolloError 错误
【发布时间】:2021-09-09 00:11:38
【问题描述】:

我有一个 Apollo GraphQL 服务器,我只想报告内部服务器错误(而不是扩展 ApolloError 的错误,如 AuthenticationErrorUserInputError 等)。

这是我编写的用于捕获内部服务器错误并报告它们的插件:

const errorReportingPlugin = {
    requestDidStart(_) {
        return {
            didEncounterErrors(ctx) {
                // If we couldn't parse the operation, don't do anything
                if (!ctx.operation) return

                for (const err of ctx.errors) {
                    // Don't report errors extending ApolloError like AuthenticationError, UserInputError, etc.
                    if (err instanceof ApolloError) {
                        continue
                    }

                    // report error here...
                }
            }
        }
    }
}

但是,当我抛出 AuthenticationError 时,err instanceof ApolloError 返回 false,它扩展了 ApolloError

所以我尝试通过打印构造函数名称来检查errclass,并得到GraphQLError

console.log(err.constructor.name)

有谁知道如何避免报告扩展 ApolloError 的所有错误?

【问题讨论】:

  • @xadm 我不想省略堆栈跟踪。我正在尝试在发生内部服务器错误时向自己发送电子邮件,但在发生扩展 ApolloError 的错误时不会。
  • 你读过这个吗? ... from this page 'formatError (a GraphQLError) 收到的错误实例包含 originalError 属性'

标签: graphql apollo-server


【解决方案1】:

解决方案是检查err.originalError(不是err)是否是ApolloError的实例,如下所示:

if (err.originalError instanceof ApolloError) {
    // don't report error since it is a user facing error like AuthenticationError, UserInputError, etc.
}

感谢@xadm

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2019-05-15
    • 2018-07-30
    • 2021-10-03
    • 1970-01-01
    • 2018-10-21
    • 2018-01-28
    • 2021-11-18
    • 2020-09-29
    相关资源
    最近更新 更多