我有一个执行数据库查询并返回预期结果的模式指令。我使用此伪指令的某些字段是不可为空的。这意味着在用户输入错误(例如客户端要求一些不存在的数据)的情况下,客户端将获得“无法为不可为空的字段返回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;
};
}
}
答案 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
属性,该属性引用包装的类型。