0

0

GraphQL Yoga 中捕获错误并访问上下文的完整指南

花韻仙語

花韻仙語

发布时间:2026-03-06 09:14:03

|

636人浏览过

|

来源于php中文网

原创

GraphQL Yoga 中捕获错误并访问上下文的完整指南

在 GraphQL Yoga 中,可通过 useLogger 插件监听执行阶段错误事件,精准获取操作名、错误详情及上下文信息,实现与 Apollo Server didEncounterError 相同的可观测性能力。

在 graphql yoga 中,可通过 `uselogger` 插件监听执行阶段错误事件,精准获取操作名、错误详情及上下文信息,实现与 apollo server `didencountererror` 相同的可观测性能力。

GraphQL Yoga 作为轻量、现代且兼容性优异的 GraphQL 服务器运行时,虽未直接提供名为 didEncounterError 的生命周期钩子,但其插件系统(尤其是 useLogger)提供了功能对等、语义清晰且更灵活的错误捕获机制。

useLogger 是 Yoga 内置的核心可观测性插件,它会在请求生命周期的关键节点(如 executeStart、executeEnd、willSendResponse 等)触发日志事件。其中,executeEnd 事件天然携带完整的执行结果(含 errors 数组)和上下文快照,是替代 didEncounterError 的首选方案。

以下为标准用法示例:

AI神器大全
AI神器大全

AI工具集合导航站

下载
import { createYoga, useLogger } from 'graphql-yoga';

const yoga = createYoga({
  schema,
  plugins: [
    useLogger({
      logFn: (eventName, args) => {
        // 仅在执行完成且存在错误时处理
        if (eventName === 'executeEnd' && args.result?.errors?.length > 0) {
          console.log('Operation Name:', args.operationName || 'anonymous');
          console.log('Errors:', args.result.errors);
          console.log('Context (partial):', {
            // 注意:args.context 是执行上下文的浅拷贝,可用于读取(如 req, user, db 等)
            hasUser: !!args.context?.user,
            requestID: args.context?.requestId,
          });
        }
      },
    }),
  ],
});

关键特性说明

  • args.result.errors 包含所有 GraphQL 执行期抛出的 GraphQLError 实例(含原始 originalError);
  • args.operationName 提供当前请求的操作名称(如 "GetUser"),便于日志聚合与追踪;
  • args.context 是执行上下文对象(即 context 函数返回值),可安全读取(如认证用户、数据库连接、请求元数据等),但不可修改
  • eventName 支持精细化控制,避免无谓日志(例如仅响应发送前检查:eventName === 'willSendResponse')。

⚠️ 注意事项

  • useLogger 默认记录所有事件;生产环境建议过滤 eventName 并限制日志级别,避免性能损耗;
  • 若需访问原始 HTTP 请求对象(如 req.headers),请确保 context 工厂函数已将其注入(例如 context: ({ req }) => ({ req }));
  • 错误堆栈默认被 GraphQL 屏蔽(extensions.exception 仅在开发环境暴露);如需完整异常信息,请配合 maskedErrors: false(仅限开发)或自定义 formatError;
  • 不要在此处执行阻塞 I/O(如写文件、调用外部 API),否则会拖慢整个请求链路;高阶需求建议将错误转发至 Sentry、Datadog 等专用监控服务。

总结而言,useLogger 不仅复现了 Apollo Server 的错误钩子能力,还通过结构化事件模型提供了更强的可扩展性。迁移时只需替换插件配置、调整事件判断逻辑,即可无缝升级错误可观测体系。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

23

2026.01.21

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

600

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

600

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

382

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2107

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号