如何在NestJS中延迟解析模块?

问题描述 投票:0回答:1

我正在阅读 这个关于延迟加载的 NestJS 文档

我正在尝试在无服务器环境中使用nestjs之外的nestjs模块。人们这样做的文档参考。

下面的代码用于获取 AppService 以及注入的所有依赖项

"use server";

import { NestFactory } from "@nestjs/core";
import { AppModule } from "@api/app.module";
import { AppService } from "@api/app.service";


export async function getHelloAction() {
    const app = await NestFactory.create(AppModule);
    const appService = app.get(AppService);
    const result = appService.getHello();
    await app.close();
    return result;
}

我的理解是,当我调用 NestFactory.create() 时,所有模块都会默认实例化。

因此,即使我的 Module 类有很多额外的模块,我也想仅在需要时才懒惰地解析模块。

根据文档,我似乎需要编写如下代码:

"use server";

import { AppModule } from "@api/app.module";
import { NestFactory } from "@nestjs/core";
import { LazyModuleLoader } from "@nestjs/core";

export async function getLazyHelloAction() {
  const app = await NestFactory.create(AppModule);

  // At this point, AppModule and all its dependencies are instantiated

  const lazyModuleLoader = app.get(LazyModuleLoader);

  // Later, when you need to load an additional module

    const { AppService } = await import('@api/app.service');
    const moduleRef = await lazyModuleLoader.load(() => AppService);
    const appService = moduleRef.get(AppService);
    // Now LazyModule is loaded and its providers are available


    const result = appService.getHello();
    return result;
}

上面的方法有效,但我收到此错误

 ⨯ Error: Classes annotated with @Injectable(), @Catch(), and @Controller() decorators must not appear in the "imports" array of a module.
Please remove "AppService" (including forwarded occurrences, if any) from all of the "imports" arrays.

Scope []

    at async getLazyHelloAction (./src/app/lazy-action.ts:23:23)

更重要的是,我不明白这个延迟加载模块是如何实现的。如果我们进一步澄清术语,称之为“注册”模块和“解析”模块,那么这里的延迟加载是什么意思?

在上面的延迟加载代码中,我仍在调用 NestFactory.create(),因此我假设所有模块都已实例化。所以模块大的话启动时间会很长

在这种情况下,lazilyLoading 是否意味着 AppService 不在 AppModule 内部,并且在需要时延迟/手动注册?就“lazyLoad”这个术语而言,这似乎有点违反直觉,并且对我来说没有什么用处。

如何导入模块并仅在需要时才实例化它们,就像在典型的 di 容器中一样?

dependency-injection nestjs lazy-loading
1个回答
0
投票

所以我意识到延迟加载意味着

registering
resolving
。下面的代码用于延迟加载模块并使用模块内的服务。之前我懒惰地加载服务导致了错误。

延迟加载

"use server";

import { AppModule } from "@api/app.module";
import { NestFactory } from "@nestjs/core";
import { LazyModuleLoader } from "@nestjs/core";

export async function getLazyHelloAction() {
    // AppModule should have minimal stuff in it
    const app = await NestFactory.create(AppModule);

    const lazyModuleLoader = app.get(LazyModuleLoader);

    const { LazyModule } = await import("@api/lazy/lazy.module");
    const { LazyService } = await import("@api/lazy/lazy.service");
    const moduleRef = await lazyModuleLoader.load(() => LazyModule);
    const lazyService = moduleRef.get(LazyService);


    const result = lazyService.getLazyHello();
    return result;
}
// lazy.module
import { Logger, Module } from '@nestjs/common';
import { LazyService } from './lazy.service';

@Module({
  providers: [LazyService, Logger],
  exports: [LazyService],
})
export class LazyModule {}
// lazy.service
import { Injectable, Logger } from '@nestjs/common';

@Injectable()
export class LazyService {
  constructor(private readonly logger: Logger) {}

  getLazyHello(): string {
    const message = 'Lazy Hello World!';
    this.logger.log(message);
    return message;
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.