我有一个模式指令,它执行数据库查询并返回预期结果。我使用此指令的某些字段是不可空的。这意味着,在存在错误用户输入的情况下,例如客户端请求一些不存在的数据,客户端将获得"无法为不可空字段返回 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;
};
}
}
传递给visitFieldDefinition
的field
对象类型为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
属性。