无法读取未定义的属性“ngModule”

sav*_*vke 4 angular

我在应用程序上有三个模块,其中一个是主模块,用于其他两个模块。当我启动应用程序并直接转到导入主模块的这些模块之一时,浏览器控制台中会显示此错误:

core.js:4117 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'ngModule' of 

undefined
TypeError: Cannot read property 'ngModule' of undefined
    at isModuleWithProviders (core.js:26882)
    at expandModuleWithProviders (core.js:26876)
    at Array.map (<anonymous>)
    at Function.get (core.js:26534)
    at registerNgModuleType (core.js:24758)
    at core.js:24769
    at Array.forEach (<anonymous>)
    at registerNgModuleType (core.js:24769)
    at new NgModuleFactory (core.js:24872)
    at Compiler_compileModuleSync__POST_R3__ (core.js:27732)
    at resolvePromise (zone.js:832)
    at resolvePromise (zone.js:784)
    at zone.js:894
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:28122)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:420)
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:188)
    at drainMicroTaskQueue (zone.js:601)
Run Code Online (Sandbox Code Playgroud)

但是当我再次启动应用程序并直接转到主模块时(他工作并且一切正常),然后我转到导入主模块而不是工作的模块之一。

我认为问题在于在这两个模块中加载主模块。但我不知道是什么引起了这种反应。

如果有人建议尝试解决此解决方案的方法,只需提出建议即可。

Sin*_*dan 9

如上所述,错误是由Module importing引起的。

如何找到错误的准确位置? (尤其是在具有多个相互依赖模块的复杂项目中,例如在我们团队的项目中)

core.js:26131遗漏的类型错误:无法读取属性'ngModule'的未定义 在isModuleWithProviders(core.js:26131)在expandModuleWithProviders(core.js:26125)在Array.map()在Function.get(core.js:25781 ) 在 registerNgModuleType (core.js:24103) at core.js:24114 at Array.forEach () at registerNgModuleType (core.js:24114) at new NgModuleFactory$1 (core.js:24211) at compileNgModuleFactory__POST_R3__ () )

在浏览器的开发工具中,在发生错误的行(在本例中为 core.js:26131)放置一个 Debug 断点。那里的代码对我们没有多大帮助,因为它是错误记录功能(可能defaultErrorLogger)。然而,当断点被触发时,我们可以继续我们的开发工具调用堆栈,直到以下代码(或类似代码)真正发生错误:

function isModuleWithProviders(value) {
    return value.ngModule !== undefined;
}
Run Code Online (Sandbox Code Playgroud)

当value未定义时会发生错误,因此我们可以在此处放置一个带有条件的条件断点!value,这将显着加快错误追踪过程(仅在错误的模块导入时触发)。

当条件断点被触发时,我们可以再次向上调用调用堆栈,直到get我们可以访问的方法moduleType.name找到导致错误的模块的名称。

在第二部分中,我们打开具有该名称的模块,在那里我们可以使用分而治之的方法,通过注释模块导入,直到错误消失。

  • 你知道在进行“ng test”时如何做到这一点吗?控制台输出 `at isModuleWithProviders (../../../packages/core/src/render3/jit/module.ts:560:38)` 但我不确定可以使用 console.log( )来追踪问题。 (2认同)