- 有没有办法通过覆盖所有查询和突变的 SchemaDirectiveVisitor 的方法之一来添加架构指令?例如,检查指令中的身份验证令牌。最好只添加一次,而不是为每个定义的查询/突变添加一次。
-
如果是,应覆盖以下哪种方法以及如何覆盖?我找不到有关如何覆盖它们中的每一个的示例。
-
visitSchema(schema: GraphQLSchema)
-
visitScalar(scalar: GraphQLScalarType)
-
visitObject(object: GraphQLObjectType)
-
visitFieldDefinition(field: GraphQLField<any, any>)
-
visitArgumentDefinition(argument: GraphQLArgument)
-
visitInterface(iface: GraphQLInterfaceType)
-
visitUnion(union: GraphQLUnionType)
-
visitEnum(type: GraphQLEnumType)
-
visitEnumValue(value: GraphQLEnumValue)
-
visitInputObject(object: GraphQLInputObjectType)
-
visitInputFieldDefinition(field: GraphQLInputField)
-
我的直觉会说,visitObject(object: GraphQLObjectType)
因为type Query
是一个GraphQLObjectType
.
- 最终的指令位置是什么?对象还是查询/突变?
要访问对象(你是对的查询是),请使用visitObject
,对于特定的 api 端(查询中的任何方法),请使用visitFieldDefinition
我已经通过以下方式实现了它,
class authDirective extends SchemaDirectiveVisitor {
visitObject(type) {
this.ensureFieldsWrapped(type);
type._requiredAuthRole = this.args.requires;
}
visitFieldDefinition(field, details) {
this.ensureFieldsWrapped(details.objectType);
field._requiredAuthRole = this.args.requires;
}
ensureFieldsWrapped(objectType){
const fields = objectType.getFields();
//your logic to resolve directive
}
}
module.exports = authDirective;
在图中QL shema
directive @authorization(requires: Role) on OBJECT | FIELD_DEFINITION
在架构构建器或服务器中包括
resolvers,
schemaDirectives: {
authorization: authDirective
}