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

如何在NodeJS apollo-server的GraphQL查询响应中获取弃用警告

基于Apollo Server实现弃用字段警告返回extensions的方案

Apollo Server默认不会自动将@deprecated标记的字段访问警告写入响应的extensions字段,你可以通过自定义插件实现该需求,步骤如下:

实现步骤

  • 保留你现有的类型定义中@deprecated注解的写法,不需要修改
  • 新增自定义Apollo插件,用于收集查询过程中访问的弃用字段信息,在请求返回前写入extensions
  • 服务初始化时注册该插件即可

完整示例代码

const { ApolloServer, gql } = require('apollo-server');

// 类型定义和你现有写法一致
const typeDefs = gql`
type Post {
    title: String
    isPublished: Boolean @deprecated(reason: "no longer supported")
}

type Query {
    getPost: Post
}
`;

// 示例解析器,可替换为你自己的业务逻辑
const resolvers = {
  Query: {
    getPost: () => ({ title: "示例文章", isPublished: true })
  }
};

// 收集弃用字段警告的自定义插件
const deprecatedWarningPlugin = {
  requestDidStart() {
    return {
      executionDidStart() {
        const warnings = [];
        return {
          // 字段解析阶段判断是否为弃用字段
          resolveField(_, fieldContext) {
            const fieldDef = fieldContext.fieldDef;
            if (fieldDef?.deprecationReason) {
              warnings.push({
                message: `字段 ${fieldDef.name} 已弃用:${fieldDef.deprecationReason}`,
                path: fieldContext.path
              });
            }
          },
          // 执行完成后将警告写入响应extensions
          executionDidEnd() {
            if (warnings.length) {
              return {
                willSendResponse({ response }) {
                  response.extensions = response.extensions || {};
                  response.extensions.warnings = warnings;
                }
              };
            }
          }
        };
      }
    };
  }
};

// 初始化服务时注册插件
const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [deprecatedWarningPlugin]
});

server.listen().then(({ url }) => console.log(`服务运行地址:${url}`));

效果验证

当你发起的查询包含isPublished弃用字段时,返回的响应会自动携带extensions字段,示例返回如下:

{
  "data": {
    "getPost": {
      "title": "示例文章",
      "isPublished": true
    }
  },
  "extensions": {
    "warnings": [
      {
        "message": "字段 isPublished 已弃用:no longer supported",
        "path": ["getPost", "isPublished"]
      }
    ]
  }
}

如果查询未使用任何弃用字段,则不会额外添加extensions参数,和默认行为保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:15:04