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工具
classSchemaDirectiveVisitor
直接相关,它用于在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)
}
}
正如我所提到的,这种方法对我来说很好,但我不喜欢在类外有一个全局变量,而我想在类内有一个全局变量。我曾尝试将其存储在类内的变量中,甚至存储在类内的另一个方法中,但我有两个问题
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())代码>