使用 GraphQL Apollo 忽略该字段

Posted

技术标签:

【中文标题】使用 GraphQL Apollo 忽略该字段【英文标题】:Omitting the field in response with GraphQL Apollo 【发布时间】:2020-08-24 09:27:59 【问题描述】:

我正在使用 Apollo GraphQL 服务器和指令。

这是我的简单架构。注意令牌字段上的指令,用户类型。

const typeDefs = `
directive @allow(service: String) on FIELD_DEFINITION 

type User 
  email: String!
  pass: String!
  ... other fields here
  token: String  @allow(service: "login")


type Mutation 
  login(email: String!, pass: String!): User
`;

我只想在调用登录时返回令牌字段。否则,我想返回用户对象没有令牌字段,我能找到的只是抛出异常或在“令牌”字段中返回 null。

class SkipDirective extends SchemaDirectiveVisitor 
  visitFieldDefinition(field, details) 
    const  resolve = defaultFieldResolver  = field;
    field.resolve = async function (...args) 
      // If called in context different from "login"
      // Here I would like to just "delete" the "token" field
      else 
        const result = await resolve.apply(this, args);
        return result;
      
    ;
  

想法?

【问题讨论】:

【参考方案1】:

如果请求了一个字段,它应该返回一个与字段类型匹配的值,否则返回 null。否则会破坏spec。

您无法通过模式指令修改此行为。字段定义指令只能通过修改字段的解析器来更改运行时行为。但是,在调用解析器时,选择集已经确定,因此修改它为时已晚。返回 null 或抛出错误几乎是仅有的两种选择。

可能能够通过formatResponse 选项或自定义插件实现某种解决方法。但是,由于这种行为会违反规范,因此无法确定它是否不会导致客户端库或其他工具出现问题。

【讨论】:

以上是关于使用 GraphQL Apollo 忽略该字段的主要内容,如果未能解决你的问题,请参考以下文章

似乎它忽略了 apollo graphql 中的更新突变?

Apollo GraphQL 服务器:按单独解析的字段过滤(或排序)

Apollo GraphQL:未在突变子字段上调用解析器

Apollo graphql 正在为 mongodb 中的空子文档返回空数据

angular, apollo-client, graphQL - 从 graphql 查询中选择所有字段

在 reactJS 中使用动态字段的 Apollo 客户端 graphql 查询