忽略该字段以响应GraphQL Apollo

问题描述 投票:0回答:1

我正在使用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
}`;

我仅在调用登录名后才想返回令牌字段。否则,我想返回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;
      }
    };
  }
}

想法?

graphql apollo-server
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.