Graphql 阿波罗号错误指令呼叫
对于Graphql 阿波罗号错误指令呼叫,graphql,apollo,Graphql,Apollo,对于userPasswordChange出于某种原因而进行的变异,将调用minGroupdirectiveidisowneromingroup。什么是问题 export const typeDefs = gql` directive @minGroup(requires: Group = ADMINS) on OBJECT | FIELD_DEFINITION directive @idIsOwnerOrMinGroup(requires: Group = ADMINS) on OBJE
userPasswordChange
出于某种原因而进行的变异,将调用minGroup
directiveidisowneromingroup
。什么是问题
export const typeDefs = gql`
directive @minGroup(requires: Group = ADMINS) on OBJECT | FIELD_DEFINITION
directive @idIsOwnerOrMinGroup(requires: Group = ADMINS) on OBJECT | FIELD_DEFINITION
type Mutation {
userPasswordChange(oldPassword: String, newPassword: String!, id: Int!): Boolean! @idIsOwnerOrMinGroup(requires: ADMINS)
}`
import { MinGroupDirective } from '../directives/minGroupDirective'
import { IdIsOwnerOrMinGroupDirective } from '../directives/IdIsOwnerOrMinGroupDirective'
export const schemaDirectives = {
minGroup: MinGroupDirective,
idIsOwnerOrMinGroup: IdIsOwnerOrMinGroupDirective,
} as any
export const schema = makeExecutableSchema({
typeDefs,
resolvers,
schemaDirectives,
})
type MinGroupRequired = { _minGroup?: AccessGroup }
type MinGroupAvoidRewrap = { _minGroupAvoidRewrap?: true }
export class MinGroupDirective extends SchemaDirectiveVisitor {
visitObject(type: GraphQLObjectType & MinGroupRequired): void {
this.ensureFieldsWrapped(type)
type._minGroup = this.args.requires
}
// Visitor methods for nested types like fields and arguments
// also receive a details object that provides information about
// the parent and grandparent types.
visitFieldDefinition(
field: GraphQLField<any, any> & MinGroupRequired,
details: {
field: GraphQLField<any, any>
objectType: GraphQLObjectType | GraphQLInterfaceType
}
): void {
this.ensureFieldsWrapped(details.objectType)
field._minGroup = this.args.requires
}
ensureFieldsWrapped(objectType: (GraphQLObjectType | GraphQLInterfaceType) & MinGroupRequired & MinGroupAvoidRewrap): any {
// Mark the GraphQLObjectType object to avoid re-wrapping:
if (objectType._minGroupAvoidRewrap) return
objectType._minGroupAvoidRewrap = true
const fields = objectType.getFields()
Object.keys(fields).forEach((fieldName) => {
const field = fields[fieldName] as GraphQLField<any, any, any> & MinGroupRequired
const { resolve = defaultFieldResolver } = field
field.resolve = async function (...args): Promise<any> {
// Get the required Group from the field first, falling back
// to the objectType if no Group is required by the field:
const requiredGroup = field._minGroup || objectType._minGroup
if (!requiredGroup) return resolve.apply(this, args)
const ctx: Ctx<CtxUserAny> = args[2]
if (minGroupCheck(ctx.user.access_group, requiredGroup)) return resolve.apply(this, args)
throw genGqlError('')
}
})
}
}
type MinGroupRequired = { _minGroup?: AccessGroup }
type MinGroupAvoidRewrap = { _minGroupAvoidRewrap?: true }
export class IdIsOwnerOrMinGroupDirective extends SchemaDirectiveVisitor {
visitObject(type: GraphQLObjectType & MinGroupRequired): void {
this.ensureFieldsWrapped(type)
type._minGroup = this.args.requires
}
// Visitor methods for nested types like fields and arguments
// also receive a details object that provides information about
// the parent and grandparent types.
visitFieldDefinition(
field: GraphQLField<any, any> & MinGroupRequired,
details: {
field: GraphQLField<any, any>
objectType: GraphQLObjectType | GraphQLInterfaceType
}
): void {
this.ensureFieldsWrapped(details.objectType)
field._minGroup = this.args.requires
}
ensureFieldsWrapped(objectType: (GraphQLObjectType | GraphQLInterfaceType) & MinGroupRequired & MinGroupAvoidRewrap): any {
// Mark the GraphQLObjectType object to avoid re-wrapping:
if (objectType._minGroupAvoidRewrap) return
objectType._minGroupAvoidRewrap = true
const fields = objectType.getFields()
Object.keys(fields).forEach((fieldName) => {
const field = fields[fieldName] as GraphQLField<any, any, any> & MinGroupRequired
const { resolve = defaultFieldResolver } = field
field.resolve = async function (...args): Promise<any> {
// Get the required Group from the field first, falling back
// to the objectType if no Group is required by the field:
const requiredGroup = field._minGroup || objectType._minGroup
if (!requiredGroup) return resolve.apply(this, args)
const ctx: Ctx<CtxUserAny> = args[2]
const { id }: { id: number } = args[1]
if (minGroupCheck(ctx.user.access_group, requiredGroup) || (id && id === (ctx.user as Ctx['user'])?.id))
return resolve.apply(this, args)
throw genGqlError('')
}
})
}
}
导出常量typeDefs=gql`
对象|字段_定义上的指令@minGroup(要求:Group=ADMINS)
对象|字段(u定义)上的指令@IDISowneromingGroup(要求:Group=ADMINS)
类型突变{
userPasswordChange(旧密码:String,新密码:String!,id:Int!):Boolean!@IDISownerOrmingGroup(需要:ADMINS)
}`
从“../directions/MinGroupDirective”导入{MinGroupDirective}
从“../directives/IDISownerOrmingGroupDirective”导入{IDISownerOrmingGroupDirective}
导出常量schemaDirectives={
minGroup:minGroup指令,
IDISownerOrmingGroup:IDISownerOrmingGroup指令,
}一样
export const schema=makeExecutableSchema({
typeDefs,
解析器,
方案修正,
})
类型MinGroupRequired={U minGroup?:AccessGroup}
键入MinGroupAvoidRewrap={u MinGroupAvoidRewrap?:true}
导出类MinGroupDirective扩展了SchemaDirectiveVisitor{
visitObject(类型:GraphQLObjectType&MinGroupRequired):void{
此。确保焊接已搭接(类型)
type.\u minGroup=this.args.requires
}
//字段和参数等嵌套类型的访问者方法
//还接收一个详细信息对象,该对象提供有关
//父母和祖父母类型。
visitFieldDefinition(
字段:GraphQLField&MinGroupRequired,
详情:{
字段:GraphQLField
objectType:GraphQLObjectType | GraphQLInterfaceType
}
):无效{
this.ensureFeldsWrapped(details.objectType)
字段。\u minGroup=this.args.requires
}
EnsureRefieldSwrapped(objectType:(GraphQLObjectType | GraphQLInterfaceType)&MinGroupRequired&MinGroupAvoidRewrap):任意{
//标记GraphQLObjectType对象以避免重新包装:
if(objectType.\u minGroupAvoidRewrap)返回
objectType.\u minGroupAvoidRewrap=true
const fields=objectType.getFields()
Object.key(fields).forEach((fieldName)=>{
const field=字段[fieldName]作为图形qlfield&MinGroupRequired
常量{resolve=defaultFieldResolver}=field
field.resolve=异步函数(…args):承诺{
//首先从字段中获取所需的组,然后返回
//如果该字段不需要任何组,则添加到objectType:
const requiredGroup=字段。_minGroup | | objectType。_minGroup
如果(!requiredGroup)返回resolve.apply(此参数)
常量ctx:ctx=args[2]
if(minGroupCheck(ctx.user.access_group,requiredGroup))返回resolve.apply(this,args)
抛出genGqlError(“”)
}
})
}
}
类型MinGroupRequired={U minGroup?:AccessGroup}
键入MinGroupAvoidRewrap={u MinGroupAvoidRewrap?:true}
导出类IDisownerOrmingGroupDirective扩展了SchemaDirectiveVisitor{
visitObject(类型:GraphQLObjectType&MinGroupRequired):void{
此。确保焊接已搭接(类型)
type.\u minGroup=this.args.requires
}
//字段和参数等嵌套类型的访问者方法
//还接收一个详细信息对象,该对象提供有关
//父母和祖父母类型。
visitFieldDefinition(
字段:GraphQLField&MinGroupRequired,
详情:{
字段:GraphQLField
objectType:GraphQLObjectType | GraphQLInterfaceType
}
):无效{
this.ensureFeldsWrapped(details.objectType)
字段。\u minGroup=this.args.requires
}
EnsureRefieldSwrapped(objectType:(GraphQLObjectType | GraphQLInterfaceType)&MinGroupRequired&MinGroupAvoidRewrap):任意{
//标记GraphQLObjectType对象以避免重新包装:
if(objectType.\u minGroupAvoidRewrap)返回
objectType.\u minGroupAvoidRewrap=true
const fields=objectType.getFields()
Object.key(fields).forEach((fieldName)=>{
const field=字段[fieldName]作为图形qlfield&MinGroupRequired
常量{resolve=defaultFieldResolver}=field
field.resolve=异步函数(…args):承诺{
//首先从字段中获取所需的组,然后返回
//如果该字段不需要任何组,则添加到objectType:
const requiredGroup=字段。_minGroup | | objectType。_minGroup
如果(!requiredGroup)返回resolve.apply(此参数)
常量ctx:ctx=args[2]
常量{id}:{id:number}=args[1]
if(minGroupCheck(ctx.user.access_group,requiredGroup)| |(id&&id==(ctx.user作为ctx['user'])?.id))
返回resolve.apply(此参数为args)
抛出genGqlError(“”)
}
})
}
}
似乎他们每次都会呼叫,不确定原因。在我将directive从
字段更改为类型之后,问题就解决了。但我想看看解释
type MinGroupOrOwnerRequired = { _minGroupOrOwner?: AccessGroup }
type MinGroupOrOwnerAvoidRewrap = { _minGroupOrOwnerAvoidRewrap?: true }
export class IdIsOwnerOrMinGroupDirective extends SchemaDirectiveVisitor {
visitObject(type: GraphQLObjectType & MinGroupOrOwnerRequired): void {
this.ensureFieldsWrapped(type)
type._minGroupOrOwner = this.args.requires
}
// Visitor methods for nested types like fields and arguments
// also receive a details object that provides information about
// the parent and grandparent types.
visitFieldDefinition(
field: GraphQLField<any, any> & MinGroupOrOwnerRequired,
details: {
field: GraphQLField<any, any>
objectType: GraphQLObjectType | GraphQLInterfaceType
}
): void {
this.ensureFieldsWrapped(details.objectType)
field._minGroupOrOwner = this.args.requires
}
ensureFieldsWrapped(objectType: (GraphQLObjectType | GraphQLInterfaceType) & MinGroupOrOwnerRequired & MinGroupOrOwnerAvoidRewrap): any {
// Mark the GraphQLObjectType object to avoid re-wrapping:
if (objectType._minGroupOrOwnerAvoidRewrap) return
objectType._minGroupOrOwnerAvoidRewrap = true
const fields = objectType.getFields()
Object.keys(fields).forEach((fieldName) => {
const field = fields[fieldName] as GraphQLField<any, any, any> & MinGroupOrOwnerRequired
const { resolve = defaultFieldResolver } = field
field.resolve = async function (...args): Promise<any> {
// Get the required Group from the field first, falling back
// to the objectType if no Group is required by the field:
const requiredGroup = field._minGroupOrOwner || objectType._minGroupOrOwner
if (!requiredGroup) return resolve.apply(this, args)
const ctx: Ctx<CtxUserAny> = args[2]
const { id }: { id: number } = args[1]
if (minGroupCheck(ctx.user.access_group, requiredGroup) || (id && id === (ctx.user as Ctx['user'])?.id))
return resolve.apply(this, args)
throw genGqlError('')
}
})
}
}
type MinGroupOrOwnerRequired={u minGroupOrOwner?:AccessGroup}
类型MinGroupOrOwnerAvoidRewrap={u MinGroupOrOwnerAvoidRewrap?:true}
导出类IDisownerOrmingGroupDirective扩展了SchemaDirectiveVisitor{
visitObject(类型:GraphQLObjectType&MinGroupOrOwnerRequired):无效{
此。确保焊接已搭接(类型)
类型。_minGroupOrOwner=this.args.requires
}
//字段和参数等嵌套类型的访问者方法
//还接收一个详细信息对象,该对象提供有关
//父母和祖父母类型。
visitFieldDefinition(
字段:需要GraphQLField和MingrouporOwner,
详情:{
字段:GraphQLField
objectType:GraphQLObjectType | GraphQLInterfaceType
}
):无效{
this.ensureFeldsWrapped(details.objectType)
字段。\u minGroupOrOwner=this.args.requires
}
确保覆盖(对象类型:(GraphQLObjectType | GraphQLInterfaceType)&MinGroupOrOwnerRequired&MingrouporOwnerRavoidRewrap):任何{
//标记GraphQLObjectType对象以避免重新包装:
if(objectType.\u minGroupOrOwnerAvoidRewrap)返回
objectType.\u minGroupOrOwnerAvoidRewrap=true
const fields=objectType.get