Javascript 存储变量";戈巴利“;在graphql指令中由多个方法使用的类中

Javascript 存储变量";戈巴利“;在graphql指令中由多个方法使用的类中,javascript,class,graphql,graphql-tools,custom-directive,Javascript,Class,Graphql,Graphql Tools,Custom Directive,所以我觉得我的问题很可能是一个关于类和this的JS语法问题,但我的问题与graphql工具classSchemaDirectiveVisitor直接相关,它用于在graphql中创建自定义指令 一点背景: 在GraphQL中生成自定义指令时,一种方法是扩展GraphQL工具提供的SchemaDirectiveVisitor类,并重写可应用于gql模式不同位置的任何默认方法。可以看到更多细节 在我的具体案例中,我使用方法visitInputFieldDefinition,因为我想添加一些自定义逻

所以我觉得我的问题很可能是一个关于类和
this
的JS语法问题,但我的问题与
graphql工具
class
SchemaDirectiveVisitor
直接相关,它用于在graphql中创建自定义指令

一点背景: 在GraphQL中生成自定义指令时,一种方法是扩展GraphQL工具提供的SchemaDirectiveVisitor类,并重写可应用于gql模式不同位置的任何默认方法。可以看到更多细节

在我的具体案例中,我使用方法
visitInputFieldDefinition
,因为我想添加一些自定义逻辑,以验证用户是否有权编辑特定字段。
visitInputFieldDefinition
的主要问题是,它似乎只在构建服务器时启动,因为它没有解析器功能。同时,其他方法,如
visitFieldDefinition
确实有一个
resolve()
函数,每当有新的请求使用此指令时,该函数都会触发

我试图做的是在调用
visitInputFieldDefinition
时,即服务器在读取我的gql模式后启动时,将一些数据存储在数组中。我可以在类之外的数组中保存一些数据,然后在我的resolve()函数中使用这些数据来确定是继续还是返回错误。我能够做到这一点,而且它是有效的,但我的问题实际上是,我如何能够获得相同的行为,但以某种方式将这些数据存储在类内的变量中,而不是类外的全局变量中

所以我的代码,简化后,看起来像这样

//variable outside my class where i store in memory some data from class
let outsideVar = []

class RestrictFieldsDirective extends SchemaDirectiveVisitor {
    visitFieldDefinition(field) {
        const originalResolve = field.resolve || defaultFieldResolver;

        field.resolve = async function(...args){
            //Do Stuff here with the stored array
            // return error or apply the resolver depending on data in array
            if(outsideVar) //more complicated checks on data
               return new ApolloError()

            return resolve.apply()
        }
    }

    visitInputFieldDefinition(field){
        // Do stuff here to store data provided on application build when this method gets 
        called
        outsideVar.push(someData)

    }
}
正如我所提到的,这种方法对我来说很好,但我不喜欢在类外有一个全局变量,而我想在类内有一个全局变量。我曾尝试将其存储在类内的变量中,甚至存储在类内的另一个方法中,但我有两个问题

  • 在启动服务器时,该类会被多次调用,因此即使我在构造函数级别将数据存储在一个var中,它也不会通过多次调用保持不变,如果在
    constructor()
    i中包含类似
    this.myVar=[]

  • 我似乎无法访问
    字段.resolve()
    函数中的
    this
    ,我也不知道如何授予它访问类
    this
    的权限,以便调用另一个方法或类变量,如
    this.myVar

  • 问题主要是关于最佳实践,有什么可能的改进可以避免使用外部全局变量,或者根本没有办法做到这一点,这种方法可以被认为是“正确的”


    谢谢你的阅读!任何讨论都是欢迎和有用的

    今天我了解到,由类的构造函数构造的对象的原型就是类本身。因此,使用
    Object.getPrototypeOf
    的一些Shenangans可以存储一个可用于类的所有实例的静态属性:

    类的东西{
    构造函数(){
    //如果我们需要在第一次创建对象时初始化值
    Object.getPrototypeOf(this.staticProp)
    =Object.getPrototypeOf(this).staticProp | | 0;
    }
    setStaticProp(val){
    Object.getPrototypeOf(this.staticProp=val;
    }
    getStaticProp(){
    返回Object.getPrototypeOf(this.staticProp);
    }
    }
    const thing1=新事物();
    const thing2=新事物();
    console.log(thing1.getStaticProp())
    第1项:设置固定点(42);
    
    log(thing2.getStaticProp())今天我了解到,由类的构造函数构造的对象的原型就是类本身。因此,使用
    Object.getPrototypeOf
    的一些Shenangans可以存储一个可用于类的所有实例的静态属性:

    类的东西{
    构造函数(){
    //如果我们需要在第一次创建对象时初始化值
    Object.getPrototypeOf(this.staticProp)
    =Object.getPrototypeOf(this).staticProp | | 0;
    }
    setStaticProp(val){
    Object.getPrototypeOf(this.staticProp=val;
    }
    getStaticProp(){
    返回Object.getPrototypeOf(this.staticProp);
    }
    }
    const thing1=新事物();
    const thing2=新事物();
    console.log(thing1.getStaticProp())
    第1项:设置固定点(42);
    log(thing2.getStaticProp())