在 GraphQL 模式指令中,有没有办法检查预期的返回字段是否不可为空



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

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

代码如下:

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;
};
}
}

传递给visitFieldDefinitionfield对象类型为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>;
}

因此,您可以通过访问field.type来确定字段的类型。非空是包装器类型。如果字段为 non null,则field.type将返回一个GraphQLNonNull对象,其中包含引用包装类型的ofType属性。

最新更新