从ApolloServer迁移至GraphQL Yoga,如何获取错误触发时的上下文?
在GraphQL Yoga中捕获错误并获取上下文
针对从ApolloServer迁移到GraphQL Yoga时需要在错误发生时获取上下文的需求,这里提供两种实现方式:
方式一:直接使用Yoga的onError配置
Yoga的服务器配置内置了onError方法,可直接接收错误和上下文参数,快速实现需求:
import { createYoga } from 'graphql-yoga'; import { schema } from './your-schema'; const yoga = createYoga({ schema, onError: (error, context) => { // 提取操作名称 const operationName = context.operation?.name?.value; console.log(operationName); console.log(error); } });
context参数包含了请求全量上下文信息,除了操作对象,还能获取请求详情、自定义上下文数据等。
方式二:使用Envelop插件(贴近Apollo插件模式)
GraphQL Yoga基于Envelop构建,你可以通过自定义Envelop插件来模拟Apollo的didEncounterErrors生命周期钩子,适合需要更复杂请求流程处理的场景:
import { createYoga } from 'graphql-yoga'; import { schema } from './your-schema'; import { useEnvelop } from '@envelop/core'; const errorLoggingPlugin = { onExecute: ({ args, setExecuteResultHandler }) => { setExecuteResultHandler((result) => { if (result.errors) { // 获取操作名称:优先用传入的operationName,否则从文档定义中提取 const operationName = args.operationName || args.document.definitions[0]?.name?.value; console.log(operationName); result.errors.forEach(error => { console.log(error); }); } return result; }); } }; const yoga = createYoga({ schema, plugins: [useEnvelop([errorLoggingPlugin])] });
如果需要在请求初始化阶段做额外处理,还可以给插件加上onRequest钩子,对应Apollo的requestDidStart:
const errorLoggingPlugin = { onRequest: ({ context }) => { // 请求开始时的初始化逻辑,比如记录请求ID等 }, onExecute: ({ args, setExecuteResultHandler }) => { // 错误处理逻辑同上 } };
内容的提问来源于stack exchange,提问作者random agent
相关产品推荐
相关产品推荐

