升级到 Angular 11 后,必须从注入上下文中调用“inject()”

dis*_*ame 5 openapi angular openapi-generator springdoc

升级到 Angular 11 后,我无法再访问ng serve我的 Web 应用程序。

我正在使用 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]
Run Code Online (Sandbox Code Playgroud)

以下是我的tsconfig.json文件:

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]
Run Code Online (Sandbox Code Playgroud)

这就是我定义依赖项的方式 package.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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这是在上面的错误消息中提到的那些生成的行:

    "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",
Run Code Online (Sandbox Code Playgroud)

这曾经在 Angular 9 中工作,但它不会在 Angular 11 下工作。

知道如何解决这个问题吗?我已经尝试"preserveSymlinks": true按照此处此处的建议进行设置。

如果您需要更多信息,请告诉我。

lil*_*nux 17

如果这是一个多项目设置(又名 monorepo),您必须注意以下事项:

  • 根目录(具有projects子目录的文件夹)应该有一个package.json和一个node_modules目录
  • 只有 类型的项目library才有 apackage.json并且它们应该只具有对等依赖关系。不要跑到npm install这里!node_modules这里一定不能有目录
  • 应用程序项目根本没有 a ,因此也package.json没有node_modules
  • 该库不需要被列为依赖项。tsconfig.json使用 中的路径compilerOptions来使用它。

我发现 github 上的这个示例框架项目有助于解决我的注入问题:

https://github.com/PeterKassenaar/ng-monorepo


小智 7

由于生成的 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