首页 文章

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

提问于
浏览
29

这是我在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 
...

7 回答

  • 0

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

    import {Injectable, NgModule} from '@angular/core';
    
    @NgModule({providers: [FooService]}) // WRONG: used before declared
    export class FooModule {
    }
    
    @Injectable()
    export class FooService {
    }
    

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

    import {forwardRef, Injectable, NgModule} from '@angular/core';
    
    @NgModule({providers: [forwardRef(() => FooService)]})
    export class FooModule {
    }
    
    @Injectable()
    export class FooService {
    }
    
  • 17

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

    • 我进入了node_modules \ @angular \ compiler \ bundles \ compiler.umd.js文件

    • 我找到了它所说的行:"Encountered undefined provider! Usually this means you have a circular dependencies. This might be caused by using 'barrel' index.ts files."

    • 在添加"console.log('type', type);"之前的一行,以便查看哪个文件是未定义的提供程序(您还可以在其中控制日志其他相关变量) .

    • 在相关文件中,我发现导致该问题的'barrel'导入,并将其替换为精确文件路径导入 .

  • 1

    检查模块是否可以找到您提到的服务 .

    在我的情况下,我从 guards 文件夹导出 guard . 该文件夹包含一个index.ts文件 . 此 guards 文件夹 auth.guard.tscompany.guard.ts 中还有两个文件 . 理想情况下,我在索引中的这些文件如下:

    guards/index.ts 的内容

    export * from './auth.guard';
    export * from './company.guard'; // forgot this
    

    但是我忘了在 company.guard.ts 之外的那条出口上面加上一行 . 这造成了问题 .

  • 14

    错过导入以覆盖角度类时,我收到此错误 . 我想错误导入也可能以其他方式导致错误 .

    在我的情况下,我没有 File 的import语句,它默认为File接口,这不是我想要的 . 添加 import { File } from "@ionic-native/file" 修复了问题 .

  • 0

    我还控制台在node_modules \ @angular \ compiler \ bundles \ compiler.umd.js文件中记录了值 right before the error message 语句 .

    并检查 Document interfacecomponent 中的 company.guard.ts ,这是根本原因 .

    removed it to fix 这个问题 .

  • 0

    运行了这个错误--prod .

    你不能导入这样的东西:

    import { MyService } from '.';
    

    您应该使用完整路径

    import { MyService } from './my.service'
    
  • 0

    在我的情况下我改变了这一点

    @Injectable()
        export class LocationTracker {
        }
    

    @Injectable()
        export class LocationTrackerProvider {
        }
    

相关问题