Angular2“没有 t 的提供者!”和未捕获(承诺):错误:DI 错误

Posted

技术标签:

【中文标题】Angular2“没有 t 的提供者!”和未捕获(承诺):错误:DI 错误【英文标题】:Angular2 "No provider for t!" and Uncaught (in promise): Error: DI Error 【发布时间】:2017-06-21 08:06:57 【问题描述】:

我在 Angular 2 中构建了一个应用程序,但遇到了一个问题。 我使用 Angular CLI 创建我的应用程序,我使用 Angular CLI 创建了我的组件和服务,我使用“ng serve”在本地运行应用程序,一切正常。为了为 PROD 创建构建,我使用命令“ng build --Prod --base-href ./ --aot”,它会创建一个 DIST 文件夹并在 IIS 中托管该文件夹打开应用程序正常。当我将代码签入 TFS 时,有一个事件会使用 jenkins 自动创建 DIST 文件夹并将构建推送到我的服务器。现在,如果我浏览服务器的应用程序,它会抛出以下错误“No provider for t!”和错误:DI 错误。我不知道我在这里做错了什么。

以下是错误截图

非常感谢任何帮助。

【问题讨论】:

尝试使用 --aot 进行编译。 @BoyanKostadinov:是带还是不带--aot?如果没有 --aot,我已经尝试过使用 --aot 并将应用程序托管在 IIS 中并且它可以工作 那么这是您在 Jenkins 服务器上构建的问题。 @BoyanKostadinov 感谢您的回复,我找到了问题所在。我在我的应用程序中使用了 ng2-Toastr,这导致了这个依赖问题。删除 toastr 解决了这个问题。 我有同样的问题,但我没有使用任何 ng2-Toastr ... 【参考方案1】:

这是查明错误的一种方法 - 首先禁用 uglify 插件(自动为生产设置) - 使用 angular-cli 无法做到这一点。可以通过在 node_modules 目录下搜索 UglifyJSPlugin 来临时注释掉。找到后(在 common.js 文件中),将其注释掉

/*              
// Temporarily comment out this part (in common.js of node_modules) to pinpoint the error
                new UglifyJSPlugin(
                    sourceMap: buildOptions.sourceMap,
                    parallel: true,
                    cache: true,
                    uglifyOptions,
                ),
              */

再次构建您的应用并运行。然后,像这样一个神秘的错误

Unhandled Promise rejection: StaticInjectorError(ne)[t -> t]: 
  StaticInjectorError(Platform: core)[t -> t]: 
    NullInjectorError: No provider for t! ; Zone: <root> ; Task: Promise.then ; Value: Error: StaticInjectorError(ne)[t -> t]: 
  StaticInjectorError(Platform: core)[t -> t]: 
    NullInjectorError: No provider for t!

变成

Unhandled Promise rejection: StaticInjectorError(AppModule)[TranslatorService -> Http]: 
  StaticInjectorError(Platform: core)[TranslatorService -> Http]: 
    NullInjectorError: No provider for Http! ; Zone: <root> ; Task: Promise.then ; Value: Error: StaticInjectorError(AppModule)[TranslatorService -> Http]: 
  StaticInjectorError(Platform: core)[TranslatorService -> Http]: 
    NullInjectorError: No provider for Http!

【讨论】:

【参考方案2】:

已修复! 就我而言,这是因为 angular2-notifications

NotificationService

解决方案只是从 app 模块 中的 providers 数组中删除 NotificationService

但这仍然应该在 AOT 模式下通过 angular 更早地进行验证。

谢谢!

【讨论】:

【参考方案3】:

我遇到了同样的问题,结果证明是 angular2-logger 库中的一个怪癖。 This answer为我解决了问题

【讨论】:

【参考方案4】:

我遇到了同样的问题。我能够通过以下方式解决它:

    正在运行ng serve -aot。我能够找出缺少的类是什么,因为它正在运行 AOT 而无需运行 minify/uglify。 执行此操作后,我可以查看错误上下文以确定哪个组件存在问题。 转到相关组件并开始删除构造函数中的引用(发生依赖关系解析的地方。

就我而言,我在使用 angular2-logger/core 模块中的 Logger 类时遇到了问题。一旦我从构造函数中删除了引用并重新编译,它就像一个魅力。然后我用ng serve -prod 进行了测试,以确认它也已修复。

我发现的一件事是我必须明确终止 Angular CLI 并重新构建。由于某种原因,当我修改了一行并保存时,它说它重新编译并且仍然损坏。只有当我杀死它并再次运行命令时,我才发现它真的被修复了。

【讨论】:

以上是关于Angular2“没有 t 的提供者!”和未捕获(承诺):错误:DI 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 子例程中处理已捕获和未捕获的错误?

Angular 2、Http 和未设置 Content-Type “application/json”

Uploadify 加载缓慢和未捕获的错误

Bootstrap 设置错误:未捕获 ReferenceError:未定义 jQuery 和未捕获错误:Bootstrap 的 JavaScript 需要 jQuery

安装 MailChimp 弹出 js 时出现未捕获错误:引导工具提示需要 Tether 和未捕获 ReferenceError:未定义 Cookie

NullInjectorError:没有 t 的提供者! NullInjectorError: StaticInjectorError(ba)[Cw -> t]: