Получение inject() должно вызываться из контекста инъекции после обновления до Angular 11.

После обновления до Angular 11 я больше не могу ng serve использовать свое веб-приложение.

Я создаю клиент, используя Spring Doc и последний генератор OpenAPI gradle-plutin (5.0.0).

Проблема, похоже, связана с моим (сгенерированным) REST-клиентом. При открытии https://localhost:4200 в консоли будет написано следующее:

main.ts:12 Error: inject() must be called from an injection context
    at injectInjectorOnly (core.js:4901) [angular]
    at Module.ɵɵinject (core.js:4911) [angular]
    at Object.ApiModule_Factory [as factory] (meditation-rest-client.js:2885) [angular]
    at R3Injector.hydrate (core.js:11158) [angular]
    at R3Injector.get (core.js:10979) [angular]
    at :4200/vendor.js:82591:55 [angular]
    at Set.forEach (<anonymous>) [angular]
    at R3Injector._resolveInjectorDefTypes (core.js:11016) [angular]
    at new NgModuleRef$1 (core.js:25046) [angular]
    at NgModuleFactory$1.create (core.js:25100) [angular]
    at :4200/vendor.js:100468:45 [angular]
    at Object.onInvoke (core.js:28301) [angular]

Ниже приведен мой файл tsconfig.json:

/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "importHelpers": true,
    "target": "es2015",
    "module": "es2020",
    "lib": [
      "es2018",
      "dom"
    ]
  }
}

Вот как я определяю зависимость в package.json

    "chart.js": "^2.9.4",
    "core-js": "^3.8.2",
    "meditation-rest-client": "./generated/meditation-rest-client",
    "http-server": "^0.12.3",
    "http-status-codes": "^2.1.4",
    "moment": "^2.29.1",

А это те сгенерированные строки, на которые ссылается сообщение об ошибке выше:

// ...

ApiModule.ɵmod = ɵngcc0.ɵɵdefineNgModule({ type: ApiModule });
ApiModule.ɵinj = ɵngcc0.ɵɵdefineInjector({ factory: function ApiModule_Factory(t) { return new (t || ApiModule)(ɵngcc0.ɵɵinject(ApiModule, 12), ɵngcc0.ɵɵinject(ɵngcc1.HttpClient, 8)); }, providers: [], imports: [[]] });
ApiModule.ctorParameters = () => [
    { type: ApiModule, decorators: [{ type: Optional }, { type: SkipSelf }] },
    { type: HttpClient, decorators: [{ type: Optional }] }
];

// ...

Раньше это работало в Angular 9, но не в Angular 11.

Есть идеи, как это исправить? Я уже пытался установить "preserveSymlinks": true, как было предложено здесь и здесь.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person Stefan Falk    schedule 13.01.2021    source источник


Ответы (1)


Проблема может возникнуть из-за того, что сгенерированный пакет npm встраивается в какую-то выходную папку /generated/meditation-rest-client. При обращении внешнего приложения пакет API разрешает импорт @angular/core в /generated/meditation-rest-client/node_modules/@angular/core, отличающийся от /node_modules/@angular/core в корне проекта.

Решением будет удалить папку /generated/meditation-rest-client/node_modules и папку node_modules в родителях, кроме папки <project-root>/node_modules. В качестве альтернативы сгенерированный код /generated/meditation-rest-client следует скопировать в такое место, где ни одна из родительских папок не содержит папку node_modules.

См. https://github.com/OpenAPITools/openapi-generator/issues/8447

person Esteban Gehring    schedule 15.01.2021