You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:43:16