【问题标题】:Using factory to create controller使用工厂创建控制器
【发布时间】:2019-02-28 12:45:06
【问题描述】:

我想知道是否可以使用工厂来初始化控制器,然后将其添加到模块中。代码可能看起来像这样,但这不起作用:

const controllerFactory = {
  provide: DefinitionController,
  useFactory: async (service: DefinitionService) => {
    //initialization of controller
    return new DefinitionController();
  },
  inject: [DefinitionService],
};
@Module({
  controllers: [controllerFactory],
  providers: [DefinitionService],
})
export class DefinitionModule {}

似乎不支持将工厂用于控制器,但我不确定。有一个using factory for providers 的示例,但我在文档或谷歌上找不到任何控制器。

【问题讨论】:

  • 为什么要使用工厂来定义你的控制器?它使用的服务是动态的还是控制器初始化的?如果您详细说明您的用例,这将有所帮助。 :-)
  • 或者你只是想初始化你的控制器(不是动态的)?
  • 嗯,我正在尝试根据一些加载的数据向控制器添加一些新的端点。
  • 嗯,我明白了。查看我的编辑:)

标签: javascript node.js typescript nestjs


【解决方案1】:

无法使用可与自定义提供程序相媲美的异步工厂来定义您的控制器。除非使用本机 express/fastify 实例,否则您无法添加动态端点/路由:

目前没有办法动态注册路由,除非 通过使用内部 HTTP / Fastify / Express 实例

有一个issue 讨论了动态路由模块,但这可能不会很快成为嵌套的一部分:

目前我和卡米尔都很忙,所以这个问题可能需要 一些时间 - 除了其他人承担任务:)


但是你可以使用OnModuleInit生命周期事件来做静态初始化:

@Injectable()
export class DefinitionController implements OnModuleInit {
  onModuleInit() {
    console.log(`Initialization...`);
  }

当您的应用启动并可以访问控制器中注入的提供程序时,它将被调用一次,例如你的DefinitionService

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多