如何在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
相关产品推荐
相关产品推荐

