【问题标题】:Angular2 "No provider for t!" and Uncaught (in promise): Error: DI ErrorAngular2“没有 t 的提供者!”和未捕获(承诺):错误:DI 错误
【发布时间】: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 ...

标签: angular httpserver angular2-aot


【解决方案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】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2018-02-27
          • 2017-10-11
          • 1970-01-01
          • 2017-11-11
          • 1970-01-01
          • 2017-06-12
          • 1970-01-01
          • 2017-11-18
          • 1970-01-01
          相关资源
          最近更新 更多