无法使用Apollo服务器记录堆栈跟踪

发布于 2025-01-23 02:24:13 字数 2699 浏览 2 评论 0原文

我正在使用Apollo服务器构建GraphQL应用程序,并且在弄清楚如何在生产模式下记录堆栈的服务器时遇到了麻烦。

我发现目前尚不清楚如何正确记录生产中的痕迹。

我有以下formaterror函数:

    formatError: ((err) => {
      console.error(err.originalError)
      return err
  })

当我的一个解析器中的一个带有node_env = production的错误时,我会看到以下输出:

Error: Unexpected error value: "could not get config value"
    at locatedError (/tripvector/node_modules/graphql/error/locatedError.js:24:9)
    at /tripvector/node_modules/graphql/execution/execute.js:491:54
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async execute (/tripvector/node_modules/apollo-server-core/dist/requestPipeline.js:204:20)
    at async processGraphQLRequest (/tripvector/node_modules/apollo-server-core/dist/requestPipeline.js:138:28)
    at async processHTTPRequest (/tripvector/node_modules/apollo-server-core/dist/runHttpQuery.js:187:30)

但是,当我以调试模式运行时,原始错误是按照我的期望打印的:

Error: could not get config value
    at validate (file:///Users/paymahn/code/tripvector/tripvector-mono/backend/lib/settings/settings.js:11:15)
    at getGoogleSecret (file:///Users/paymahn/code/tripvector/tripvector-mono/backend/lib/settings/settings.js:29:12)
    at Object.loginWithGoogle (file:///Users/paymahn/code/tripvector/tripvector-mono/backend/api/users/graphql/mutations.js:141:30)
    at field.resolve (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/apollo-server-core/dist/utils/schemaInstrumentation.js:52:26)
    at executeField (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:469:20)
    at /Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:365:22
    at promiseReduce (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/jsutils/promiseReduce.js:23:9)
    at executeFieldsSerially (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:361:43)
    at executeOperation (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:335:14)
    at execute (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:130:20)

我将错误使用以下代码丢弃:

function validate(val) {
    if (!val) {
        throw new Error('could not get config value')
    }
    return val
}

我如何正确配置Apollo服务器以打印堆栈痕迹的错误,即使在生产中也是如此?

I'm building a graphql application with apollo server and I'm having trouble figuring out how to log stack traces serverside in production mode.

I found these docs but it's not clear how to correctly log stack traces in production.

I have the following formatError function:

    formatError: ((err) => {
      console.error(err.originalError)
      return err
  })

and when one of my resolvers throws an error with NODE_ENV=production I see the following output:

Error: Unexpected error value: "could not get config value"
    at locatedError (/tripvector/node_modules/graphql/error/locatedError.js:24:9)
    at /tripvector/node_modules/graphql/execution/execute.js:491:54
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async execute (/tripvector/node_modules/apollo-server-core/dist/requestPipeline.js:204:20)
    at async processGraphQLRequest (/tripvector/node_modules/apollo-server-core/dist/requestPipeline.js:138:28)
    at async processHTTPRequest (/tripvector/node_modules/apollo-server-core/dist/runHttpQuery.js:187:30)

However, when I run in debug mode, the original error is printed as I expect:

Error: could not get config value
    at validate (file:///Users/paymahn/code/tripvector/tripvector-mono/backend/lib/settings/settings.js:11:15)
    at getGoogleSecret (file:///Users/paymahn/code/tripvector/tripvector-mono/backend/lib/settings/settings.js:29:12)
    at Object.loginWithGoogle (file:///Users/paymahn/code/tripvector/tripvector-mono/backend/api/users/graphql/mutations.js:141:30)
    at field.resolve (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/apollo-server-core/dist/utils/schemaInstrumentation.js:52:26)
    at executeField (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:469:20)
    at /Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:365:22
    at promiseReduce (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/jsutils/promiseReduce.js:23:9)
    at executeFieldsSerially (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:361:43)
    at executeOperation (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:335:14)
    at execute (/Users/paymahn/code/tripvector/tripvector-mono/backend/node_modules/graphql/execution/execute.js:130:20)

I throw the error with the following code:

function validate(val) {
    if (!val) {
        throw new Error('could not get config value')
    }
    return val
}

How can I correctly configure apollo server to print stack traces for errors, even in production?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

彩扇题诗 2025-01-30 02:24:13

像往常一样,我在问后2分钟找到了答案。我在承诺中遇到了一些愚蠢的错误和回报,这就是为什么这个问题仅在生产中发生的原因。

As usual, I found the answer 2 minutes after asking. I was doing some silly error catching and rethrowing in promises which is why this problem was happening only in production.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文