Nest.js: у меня не может быть двух модулей с одинаковым именем в приложении. Это ошибка или особенность? - PullRequest
0 голосов
/ 08 ноября 2019

Текущее поведение

У меня не может быть двух модулей с одинаковыми именами в приложении. Только первый модуль будет доступен в приложении. В моем случае это AModule from "./my-a-module".

Входной код

Сторонняя библиотека
@Module({
    providers: [AService]
    exports: [AService]
})
export class AModule {
}

@Module({
    imports: [AModule],
    providers: [BService]
    exports: [BService]
})
export class BModule {
}
Мой код
import { BModule } from "third-party-library";
import { AModule } from "./my-a-module";

@Module({
    imports: [
        AModule,
        BModule
    ]
})
export class CModule {
}

Ожидаемое поведение

Я не уверен, что это ошибка. Но я ожидал, что у меня может быть два отдельных модуля Nest с одинаковым именем.

Среда

"@nestjs/common": "^6.9.0",
"@nestjs/core": "^6.9.0"

For Tooling issues:
- Node version: v10.16.0
- Platform: Linux

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

См. Связанную проблему https://github.com/nestjs/nest/issues/3362 и исправление https://github.com/nestjs/nest/pull/3363

0 голосов
/ 13 ноября 2019

Хорошо, поэтому, когда nest создает свой контейнер, создается экземпляр каждого класса, а прототип класса используется в качестве символа для уникальной идентификации модуля. Модули в nestjs не совпадают с модулями экспорта в ES6 MJS. Итак, что вы делаете здесь:

@Module({
  providers: [TestProvider],
})
export class ModuleA {}

@Module({})
export class ModuleA {}

const dummyContainer = {
  [ModuleA.constructor.name] = new ModuleA(),
  [ModuleA.constructor.name] = new ModuleA(),
};

Однако, в другом ответе, который я сделал, вы могли бы снова использовать DynamicModule для изменения значения ключа в приведенном выше примере, например,


@Module({})
export class ModuleA {
  public static forRoot(): DynamicModule {
    return {
      module: 'UNIQUE_IDENTIFIER',
      providers: [TestProvider],
    };
  }
}

@Module({})
export class ModuleA{}

Теперь при использовании приведенного выше примера, например,

import {ModuleA as ModuleB} from './for-root-example';
import {ModuleA} from './moduleA';

@Module({
  imports: [
    ModuleA,
    ModuleB.forRoot(),
  ],
})

ModuleA в качестве MobuleB должен иметь ключ уникального идентификатора для модуля при импорте и, следовательно, может иметь то же имя класса. Честно говоря, я бы не стал этого рекомендовать.

...