Loopbackjs 如何获得loopback4模型的完整列表,以便在引导时评估自定义装饰器元数据?

Loopbackjs 如何获得loopback4模型的完整列表,以便在引导时评估自定义装饰器元数据?,loopbackjs,loopback4,Loopbackjs,Loopback4,我目前正在将loopback3应用程序迁移到loopback4。我已经用带有一些元数据的自定义typescript装饰器对我的loopback4模型中的属性进行了注释 如何在启动时获得完整的模型列表并评估它们的元数据 我用LifeCycleObserver做了一些实验,但没有找到一种方法,在所有模型都准备好时如何得到通知,也没有找到它们的列表 下面是我要处理的元数据的简化示例。请注意:@propertyAcl是一个自定义装饰器 导出类Model1扩展了AuditMixin(SoftdeleteM

我目前正在将
loopback3
应用程序迁移到
loopback4
。我已经用带有一些元数据的自定义typescript装饰器对我的
loopback4
模型中的属性进行了注释

如何在启动时获得完整的模型列表并评估它们的元数据

我用
LifeCycleObserver
做了一些实验,但没有找到一种方法,在所有模型都准备好时如何得到通知,也没有找到它们的列表

下面是我要处理的元数据的简化示例。请注意:
@propertyAcl
是一个自定义装饰器

导出类Model1扩展了AuditMixin(SoftdeleteMixin(AbstractEntity)){ // ... @财产() @财产({ “角色1”:权限。读写, “role2”:Permission.READONLY, }) myproperty?:字符串; // ... } 我需要在启动时使用元数据配置外部库
accesscontrol
。其思想是为每个模型创建基于属性的ACL

如何在启动时获得完整的模型列表并评估它们的元数据

概述 用于创建
装饰器
,并通过
MetadataInspector
定义/获取元数据

  • 创建一个装饰工厂
  • 创建一个
    上下文
    “B”
  • 在“A”中的
    mergeWithInherited
    函数之外,我们在该函数中存储(定义)您在设计时注释到“B”的属性的元数据
  • 通过“a”创建一个
    装饰器
    “C”
  • 用“C”注释所需的任何属性
  • 在运行时获取“B”中的元数据
  • 步骤1 2 3 4

    //1
    A类扩展PropertyCoratorFactory{
    构造函数(键:字符串,规范:对象,选项?:装饰选项|未定义){
    超级(键、规格、选项);
    }
    // 3
    mergeWithInherited(inheritedMetadata:MetadataMap,target:Object,propertyName?:string,DescriptorIndex?:TypedPropertyDescriptor | number):任意{
    //将元数据定义为“B”
    MetadataInspector.DesignTimeReflector.defineMetadata(`target.constructor.name}.${propertyName}`,this.spec,B);
    }
    }
    // 2
    导出常量B=新上下文(“B.Context”);
    // 4
    导出函数C(规范:对象):PropertyCorator{
    返回一个.createDecorator(
    “C.装饰师”,
    规格,
    );
    }
    

    步骤5

    类ModelFoo扩展模型{
    @财产({
    键入:“字符串”
    })
    p1?:字符串;
    @C({元数据:“这是ModelFoo”})
    @财产({
    键入:“字符串”
    })
    p2?:字符串;
    }
    类ModelBar扩展了模型{
    @财产({
    键入:“字符串”
    })
    p1?:字符串;
    @C({元数据:“这是ModelBar”})
    @财产({
    键入:“字符串”
    })
    p2?:字符串;
    }
    

    步骤6

    功能测试(){
    //获取“B”中的所有元数据密钥
    let键:string[]=MetadataInspector.DesignTimeReflector.getMetadataKeys(B);
    //输出>>>>['ModelFoo.p2','ModelBar.p2']
    控制台日志(键);
    //使用“B”中的“ModelFoo.p2”获取元数据
    让metadata=MetadataInspector.DesignTimeReflector.getMetadata(键[0],B);
    //输出>>>{元数据:“这是ModelFoo'}
    console.log(元数据);
    //做点什么。。。
    }
    

    如何在启动时获得完整的模型列表并评估它们的元数据

    概述 用于创建
    装饰器
    ,并通过
    MetadataInspector
    定义/获取元数据

  • 创建一个装饰工厂
  • 创建一个
    上下文
    “B”
  • 在“A”中的
    mergeWithInherited
    函数之外,我们在该函数中存储(定义)您在设计时注释到“B”的属性的元数据
  • 通过“a”创建一个
    装饰器
    “C”
  • 用“C”注释所需的任何属性
  • 在运行时获取“B”中的元数据
  • 步骤1 2 3 4

    //1
    A类扩展PropertyCoratorFactory{
    构造函数(键:字符串,规范:对象,选项?:装饰选项|未定义){
    超级(键、规格、选项);
    }
    // 3
    mergeWithInherited(inheritedMetadata:MetadataMap,target:Object,propertyName?:string,DescriptorIndex?:TypedPropertyDescriptor | number):任意{
    //将元数据定义为“B”
    MetadataInspector.DesignTimeReflector.defineMetadata(`target.constructor.name}.${propertyName}`,this.spec,B);
    }
    }
    // 2
    导出常量B=新上下文(“B.Context”);
    // 4
    导出函数C(规范:对象):PropertyCorator{
    返回一个.createDecorator(
    “C.装饰师”,
    规格,
    );
    }
    

    步骤5

    类ModelFoo扩展模型{
    @财产({
    键入:“字符串”
    })
    p1?:字符串;
    @C({元数据:“这是ModelFoo”})
    @财产({
    键入:“字符串”
    })
    p2?:字符串;
    }
    类ModelBar扩展了模型{
    @财产({
    键入:“字符串”
    })
    p1?:字符串;
    @C({元数据:“这是ModelBar”})
    @财产({
    键入:“字符串”
    })
    p2?:字符串;
    }
    

    步骤6

    功能测试(){
    //获取“B”中的所有元数据密钥
    let键:string[]=MetadataInspector.DesignTimeReflector.getMetadataKeys(B);
    //输出>>>>['ModelFoo.p2','ModelBar.p2']
    控制台日志(键);
    //使用“B”中的“ModelFoo.p2”获取元数据
    让metadata=MetadataInspector.DesignTimeReflector.getMetadata(键[0],B);
    //输出>>>{元数据:“这是ModelFoo'}
    console.log(元数据);
    //做点什么。。。
    }
    

    根据我的理解,您希望在每个模型的属性上使用自定义装饰器,然后在类中取出所有相关元数据是的,像这样的。据我所知,没有任何
    ModelBooter
    可用于所有现有
    loopback4
    模型。据我所知,您希望使用自定义的