如何在GraphQL模式指令中获取字段类型(Node.js,graphql-tools)

时间:2019-02-13 15:47:06

标签: graphql apollo-server

我正在使用模式指令,该指令实现visitFieldDefinition的{​​{1}}功能。我想知道模式中定义的字段的类型,例如,如果类型是数组。

在架构中:

SchemaDirectiveVisitor

属性指令:

type DisplayProperties {
  description: StringProperty @property
  descriptions: [StringProperty]! @property
}

使用Apollo服务器和graphql工具。

2 个答案:

答案 0 :(得分:1)

传递给import os os.system("journalctl -f") if if_something_new: do_something(text) 的第一个参数是visitFieldDefinition对象:

GraphQLField

要获取类型,您可以执行以下操作:

interface GraphQLField<TSource, TContext, TArgs = { [key: string]: any }> {
    name: string;
    description: Maybe<string>;
    type: GraphQLOutputType;
    args: GraphQLArgument[];
    resolve?: GraphQLFieldResolver<TSource, TContext, TArgs>;
    subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs>;
    isDeprecated?: boolean;
    deprecationReason?: Maybe<string>;
    astNode?: Maybe<FieldDefinitionNode>;
}

如果字段为非空,列表或二者的某种组合,则需要“解包”类型。您可以随时检查包装类型是否为列表:

const type = field.type

答案 1 :(得分:0)

我们可以用

检查graphql类型
const { GraphQLString } = require('graphql');

const type = field.type

if(field.type === GraphQLString) return 'string'

我是如何使用它的?我需要使用 S3 根 URL 为 S3 对象键添加前缀,因此我创建了一个指令来执行此操作,它检查并返回条件字符串和数组。还有代码。

const { SchemaDirectiveVisitor } = require('apollo-server');
const { defaultFieldResolver, GraphQLString, GraphQLList } = require('graphql');

class S3Prefix extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field;
    field.resolve = async function (...args) {
      const result = await resolve.apply(this, args);

      if (field.type === GraphQLString) {
        if (result) {
          return [process.env.AWS_S3_PREFIX, result].join('');
        } else {
          return null;
        }
      }

      if (field.type === GraphQLList) {
        if (result) {
          return result.map((key) => [process.env.AWS_S3_PREFIX, key].join(''));
        } else {
          return [];
        }
      }
    };
  }
}

module.exports = S3Prefix;