在graphql模式指令中,是否有任何方法可以检查期望的返回字段是否为空

时间:2019-12-28 18:13:02

标签: graphql apollo

我有一个执行数据库查询并返回预期结果的模式指令。我使用此伪指令的某些字段是不可为空的。这意味着在用户输入错误(例如客户端要求一些不存在的数据)的情况下,客户端将获得“无法为不可为空的字段返回null”的一般异常。没关系,但是如果我可以抛出UserInputError

当我在解析器中执行此操作时,由于我知道该字段是什么,因此我只需检查返回值是否为null并抛出新的UserInputError即可。在指令中,我不知道该字段是否可为空,所以我不知道何时返回null或throw。有没有办法检查?

代码如下:

export class QueryDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field;
    const directiveArgs = { ...this.args };
    field.resolve = async function(obj, args, context, info) {
      const session = context.driver.session();
      let queryResult = await session.run(directiveArgs.statement, args);
      session.close();
      let result = extractResult(result, "result");
      // Any way to check here if field is non-nullable and throw new UserInputError?
      if (!directiveArgs.resolve) return resolve.call(this, result, args, context, info);
      else return result;
    };
  }
}

1 个答案:

答案 0 :(得分:0)

传递给field的{​​{1}}对象的类型为visitFieldDefinition

GraphField

因此,您可以通过访问export 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>; extensions: Maybe<Readonly<Record<string, any>>>; astNode?: Maybe<FieldDefinitionNode>; } 来确定字段的类型。非null是包装器类型。如果字段非空,则field.type将返回一个field.type对象,该对象具有一个GraphQLNonNull属性,该属性引用包装的类型。