错误:"遇到未定义的提供程序!通常这意味着您有一个循环依赖项"

Ale*_*lor 58 typescript angular

这是我在Angular/TypeScript应用程序中遇到的一个无用的错误.在有人更好地提出错误消息之前,我们可以做些什么呢?导致这种情况发生的最可能的情况是什么?

Uncaught Error: Encountered undefined provider! Usually this means you have a circular dependencies (might be caused by using 'barrel' index.ts files.
    at Object.syntaxError 
    at eval     at Array.forEach (native) [<root>]
    at CompileMetadataResolver._getProvidersMetadata 
    at CompileMetadataResolver.getNgModuleMetadata 
    at CompileMetadataResolver.getNgModuleSummary 
    at eval 
...
Run Code Online (Sandbox Code Playgroud)

Oph*_*sky 46

从错误消息中很难判断哪个提供程序导致此问题.我设法调试它的方式如下:

  • 我进入了node_modules\@angular\compiler\bundles\compiler.umd.js文件
  • 我找到了它所说的行:"遇到未定义的提供者!通常这意味着你有一个循环依赖.这可能是由于使用'桶'index.ts文件引起的."
  • 在我添加"console.log('type',type)之前的一行;" 为了查看哪个文件是未定义的提供程序(您还可以在其中控制日志其他相关变量).
  • 在相关文件中,我发现导致问题的'桶'导入,并将其替换为精确文件路径导入.

  • 我添加了console.log(`寻找$ {provider},$ {debugInfo}`); 提供程序可能未定义,但是debugInfo在失败的上下文中给出。 (3认同)
  • 除了操纵角度包文件外,还可以使用浏览器开发工具在`compiler.js`文件的相应行中添加一个断点,其中包括错误消息。一旦断点被​​击中,我便对调用堆栈进行了调查,发现了“ providers”数组,该数组基于其他导入的类型帮助我找到了错误的提供程序。 (3认同)
  • 很好的解决方案,但 @Andrew-Spoda 提供了更好的解决方案来在同一行上进行控制台登录。`console.error('\ntype: ', type, '\nproviders: ', (providers || []).map(p =&gt; p &amp;&amp; (p.name || p.useClass || p.useValue || p.useFactory || p.useExisting)));` 它显示指示实际未定义的提供程序 (2认同)

Ale*_*lor 22

一种可能性是尝试在同一文件中声明服务和模块,并在服务之前声明模块:

import {Injectable, NgModule} from '@angular/core';

@NgModule({providers: [FooService]}) // WRONG: used before declared
export class FooModule {
}

@Injectable()
export class FooService {
}
Run Code Online (Sandbox Code Playgroud)

您可以通过首先声明服务来解决此问题,或者您可以forwardRef像这样使用:

import {forwardRef, Injectable, NgModule} from '@angular/core';

@NgModule({providers: [forwardRef(() => FooService)]})
export class FooModule {
}

@Injectable()
export class FooService {
}
Run Code Online (Sandbox Code Playgroud)


Vác*_*ska 8

对我来说,只是帮助重启了NG SERVE


小智 7

我还没有对/sf/answers/3591309991/发表评论的声誉, 但最好添加以下内容:

console.error('\ntype: ', type, '\nproviders: ', (providers || []).map(p => p && (p.name || p.useClass || p.useValue || p.useFactory || p.useExisting)));
Run Code Online (Sandbox Code Playgroud)

它将显示有问题的提供者列表和模块,因此您可以打开它,并检查此提供者列表:标记为未定义的列表 - 应该修复


小智 5

我在使用 ng-packagr 打包库然后将其导入另一个库时遇到了这个问题。最终成为我的问题的确实是“桶” index.ts 进口。

这让它崩溃了

import { Activate, Another, Data } from './services
@NgModule({ providers: [ Activate, Another, Data ]})
Run Code Online (Sandbox Code Playgroud)

在 services 文件夹中,我有一个 index.ts 文件可以导出所有服务。

这修复了它:

import { Activate } from './services/activate.service.ts'
import { Another} from './services/another.service.ts'
import { Data } from './services/data.service.ts'
@NgModule({ providers: [ Activate, Another, Data ]})
Run Code Online (Sandbox Code Playgroud)