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

Apollo Server v4中,如何在错误处理时访问上下文?

解决Apollo Server v4(Express中间件)错误翻译访问上下文的问题

针对你遇到的错误翻译需要访问用户语言上下文的问题,这里提供两种可行的解决方案:

方案1:使用willSendResponse插件修改响应体

虽然requestContext.response.body.singleResult.errors是只读属性,但你可以通过重新构造整个响应体来替换错误内容。这种方式能处理所有类型的错误(包括Apollo自身的语法/验证错误):

import { ApolloServerPlugin } from '@apollo/server';
import { MyContext } from './your-context-type'; // 你的上下文类型定义

// 自定义错误翻译插件
const errorTranslationPlugin: ApolloServerPlugin<MyContext> = {
  async willSendResponse(requestContext) {
    const { context, response } = requestContext;
    const userLang = context.userLang; // 从上下文取用户语言

    // 处理单查询响应的错误
    if (response.body.kind === 'single' && response.body.singleResult.errors) {
      // 复制原错误并翻译消息
      const translatedErrors = response.body.singleResult.errors.map(err => ({
        ...err,
        message: translateErrorMessage(err.message, userLang) // 替换为你的翻译函数
      }));

      // 重新构造响应体(绕过只读限制)
      response.body = {
        ...response.body,
        singleResult: {
          ...response.body.singleResult,
          errors: translatedErrors
        }
      };
    }

    // 若需处理批量查询,可补充判断response.body.kind === 'batch'的逻辑
  }
};

注册插件到Apollo Server:

const server = new ApolloServer<MyContext>({
  typeDefs,
  resolvers,
  plugins: [errorTranslationPlugin]
});

方案2:利用formatError访问请求上下文

你可能忽略了formatError的第二个参数包含requestContext,通过它可以直接获取到请求上下文:

import { ApolloServer } from '@apollo/server';
import { MyContext } from './your-context-type';

const server = new ApolloServer<MyContext>({
  typeDefs,
  resolvers,
  formatError: (err, { requestContext }) => {
    // 从请求上下文获取用户语言,默认用'en'兜底
    const userLang = requestContext?.context.userLang || 'en';
    
    // 返回翻译后的错误对象
    return {
      ...err,
      message: translateErrorMessage(err.message, userLang)
    };
  }
});

注意事项

  • 确保你的上下文类型MyContext正确传入ApolloServer的泛型参数,这样TypeScript会提供准确的类型提示。
  • 翻译函数translateErrorMessage需根据你的业务实现,比如映射错误码到对应语言的文案。

内容的提问来源于stack exchange,提问作者Tdy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:35