angular - 升级到 Angular 12 - NullInjectorError: No provider for InjectionToken
问题描述
最初的实现是基于描述的模式
https://shashankvivek-7.medium.com/forroot-injectiontoken-in-action-angular-c2bab9959207
它一直在工作,直到我将它升级到 angular 12。升级后,我不断收到 NullInjector 错误。无论如何都无法解决它,我最终为 Angular 11 和 12 分别创建了两个普通的简单项目。此外,我将令牌提供程序从项目模块移至应用模块。
Angular 12 示例 https://drive.google.com/file/d/1lE8RL6s8L9n6zQYqVOaLqMW9ikMfMgSu/view?usp=sharing
Angular 11 示例 https://drive.google.com/file/d/1HxhCz3i5nmrK8Zj0eddTlk8zz-29lwlh/view?usp=sharing
angular 11 版本有效(甚至是 prod 模式),但另一个版本遇到了同样的错误。
这是调试器内部的样子
它看起来像线
let record = this.records.get(token);
在 R3Injector.get 中始终无法通过令牌找到记录,即使该记录存在于记录列表中,如图所示(索引 58)。正因为如此,才会添加索引 78 处的重复记录。密钥和令牌参数似乎相同。
我找不到任何关于它的确切信息或修复它的方法。
解决方案
艰难地了解了如下错误导入的危险(由 VS Code 等 IDE 自动插入)
import { Xyz } from 'projects/shared/src/public-api';
一个这样的错误导入对象导致在生成的 main.js 中双重定义 SharedConfigToken。这意味着注入器永远找不到记录,因为它是用一个 SharedConfigToken 插入的,但后来由于双重导入而被覆盖。由于 Map 键比较是 SameValueZero 它永远无法查找令牌,因此出现错误。
它浪费了我生命中的很多时间。我希望这一发现对某人有所帮助。
推荐阅读
- java - Selenium + Jenkins 集成:初始化插件时出错
- flutter - Flutter 2:更改从父级发送给子级的数据
- mysql - 是否可以为 MySQL 中的表创建数据库范围的别名?
- php - PHP动态输出数组数据
- php - 如何使用 laravel 8 显示保存在数据库中的图像?
- junit4 - JUnit 4 测试结果未在 Eclipse 中显示?
- java - Spring Boot 中 Pojo 中带有 RefreshScope 的 Bean
- c# - 结合使用 AutoMapper Mapping 和 EF Select Query
- dictionary - 问:广达。在文本中找到已识别术语的位置插入代码/标签
- .net-core - DotNet Core 5.0 EF DbContext。无法使用 appsettings.json 中的 ConnectionStrings 运行