Angular:从 renderModule 到 CommonEngine:在依赖注入树中找不到所需的 Injectable

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

我有一个包含两个应用程序的 monorepo 应用程序,一个后端使用 Node 制作,另一个使用 Angular 制作。我正在尝试使用后端以 SSR 模式渲染 Angular 应用程序,到目前为止我是这样做的:

constructor(
    @inject(TYPES.Logger) private readonly logger: Logger,
    @inject(TYPES.Server) private readonly server: Server,
    @inject(TYPES.Template) private readonly template: Template,
) {
    const frontendServerApplication = resolve(`${this.frontendServerFolder}/main.js`);

    import(frontendServerApplication).then((mainModule) => {
        this.AppServerModule = mainModule.default.AppServerModule;
        this.renderModule = mainModule.default.renderModule;
        this.ɵSERVER_CONTEXT = mainModule.default.ɵSERVER_CONTEXT;
    });
}
// This is the rendered html
const html = await this.renderModule(this.AppServerModule, {
    document: result,
    url: ctx.request.url,
    extraProviders: this.getExtraProviders(ctx, result),
});
return html

我最近升级到了 Angular 17,我想使用 CommonEngine 进行渲染:

const html = await commonEngine.render({
    bootstrap: this.AppServerModule,
    document: result,
    url: ctx.request.url,
    providers: this.getExtraProviders(ctx, result),
});
return html;

但是当我加载应用程序时,出现以下错误:

RuntimeError: NG0402: A required Injectable was not found in the dependency injection tree. If you are bootstrapping an NgModule, make sure that the `BrowserModule` is imported.
    at Object.useFactory (file:///home/marc/Desarrollo/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts:64:17)
    at Object.factory (file:///home/marc/Desarrollo/packages/core/src/di/r3_injector.ts:550:32)
    at file:///home/marc/Desarrollo/packages/core/src/di/r3_injector.ts:436:35
    at runInInjectorProfilerContext (file:///home/marc/Desarrollo/packages/core/src/render3/debug/injector_profiler.ts:279:5)
    at R3Injector.hydrate (file:///home/marc/Desarrollo/packages/core/src/di/r3_injector.ts:435:11)
    at R3Injector.get (file:///home/marc/Desarrollo/packages/core/src/di/r3_injector.ts:291:23)
    at injectInjectorOnly (file:///home/marc/Desarrollo/packages/core/src/di/injector_compatibility.ts:71:26)
    at ɵɵinject (file:///home/marc/Desarrollo/packages/core/src/di/injector_compatibility.ts:95:58)
    at injectArgs (file:///home/marc/Desarrollo/packages/core/src/di/injector_compatibility.ts:307:17)
    at Object.multiRecord.factory (file:///home/marc/Desarrollo/packages/core/src/di/r3_injector.ts:410:37) {
  code: 402

我是不是错过了什么?谢谢

angular server-side-rendering angular-ssr
1个回答
0
投票

在构造函数上使用时,需要使用

Inject()
,而不是
inject
,在构造函数外部使用时,可以使用
inject

...
constructor(
    @Inject(TYPES.Logger) private readonly logger: Logger, // <- changed here
    @Inject(TYPES.Server) private readonly server: Server, // <- changed here
    @Inject(TYPES.Template) private readonly template: Template, // <- changed here
) {
...
© www.soinside.com 2019 - 2024. All rights reserved.