【问题标题】:angular 7 TypeError: Cannot read property 'hasOwnProperty' of undefined角度 7 TypeError:无法读取未定义的属性“hasOwnProperty”
【发布时间】:2022-04-16 10:15:26
【问题描述】:

是的,在 SO 上出现了几十个类似的问题,这就是问题所在。它们都太笼统了以至于没有用。我了解此错误的含义,但希望有人可以帮助我在某个地方找到它的“原因”。

我有一个使用 CLI 生成的 Angular 7 应用程序,并且在加载我的一个模块时遇到了这个错误。无论模块是同步加载还是延迟加载,都会发生这种情况。

明显的根本原因是无法解决模块依赖关系。事实上,我已经逐步完成了@angular/core 中的模块依赖解析代码(很有趣,我会告诉你),并发现在失败点,用于解析模块依赖的注入令牌类似于“undefined_348”,而不是“Router_43”或类似的。

未定义的标记出现在与我编写的服务相对应的其他标记附近,所以我很确定我做错了什么,或者没有做我应该做的事情。但是,我有另一个模块可以注入相同的依赖项并且可以正确加载。我希望有人在相同的上下文中看到了这个错误,并且可以提供有关如何找到任性依赖项的线索。

ERROR Error: Uncaught (in promise): TypeError: Cannot read property 
'hasOwnProperty' of undefined
TypeError: Cannot read property 'hasOwnProperty' of undefined
at getInjectableDef (core.js:120)
at resolveNgModuleDep (core.js:19748)
at NgModuleRef_.push../node_modules/@angular/core/fesm5/core.js.NgModuleRef_.get (core.js:20452)
at injectInjectorOnly (core.js:1173)
at inject (core.js:1178)
at injectArgs (core.js:1230)
at core.js:14376
at _callFactory (core.js:19825)
at _createProviderInstance (core.js:19783)
at resolveNgModuleDep (core.js:19758)
at resolvePromise (zone.js:814)
at resolvePromise (zone.js:771)
at zone.js:873
. . .

顺便说一句,如果@angular/core 最终生成这样的“未定义”注入令牌,它肯定会更早地失败,所以我愿意接受任何可能有帮助的上游解决方案。

Angular CLI: 7.0.6
Node: 8.11.3
OS: linux x64
Angular: 7.1.0
... animations, cdk, common, compiler, compiler-cli, core, forms
... http, language-service, material, platform-browser
... platform-browser-dynamic, router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.10.6
@angular-devkit/build-angular     0.10.6
@angular-devkit/build-optimizer   0.10.6
@angular-devkit/build-webpack     0.10.6
@angular-devkit/core              7.0.6
@angular-devkit/schematics        7.0.6
@angular/cli                      7.0.6
@ngtools/webpack                  7.0.6
@schematics/angular               7.0.6
@schematics/update                0.10.6
rxjs                              6.3.3
typescript                        3.1.6
webpack                           4.19.1

【问题讨论】:

  • 也许您忘记在您的一项服务上使用 @Injectable 装饰器。很难用这样一个通用的错误消息来判断。您是否已经编写了自定义错误处理程序?也许这样您就可以更好地记录错误。
  • 如果可能的话,也试着让你的 tsconfig 更严格。也许你有一个非常宽容的配置导致重要的警告被忽略。
  • @enf0rcer 感谢您的回复。不幸的是,错误非常模糊。以至于完全没用。我已经按照您的建议安装了一个自定义错误处理程序,但它只是捕获相同的信息,没有其他可用的上下文。我还仔细检查了我所有的注射剂是否有正确的注释,它们都存在。我想我会继续寻找。
  • 所以是时候尝试务实的方法了。尝试一一移除此失败模块的依赖关系或使用 50% 方法。删除 50% 的依赖项,然后重新构建应用程序以查看它是否构建。这样您就可以找到导致问题的依赖项。
  • 在您的应用模块中提供包括第三方服务在内的所有使用服务,可能存在未提供的服务。我们也有同样的问题。经过太多的排查,我们发现我们没有在应用模块中提供LocalStorage和AlertService。

标签: node.js angular


【解决方案1】:

将所有服务放在 app.module.ts 的 providers 数组中,我的问题是没有将 LocalStorageService 放在 providers 中

【讨论】:

  • 欢迎来到 StackOverflow!如果您解释您的答案而不是提供说明会更好
【解决方案2】:

这个错误主题有点过时了,但我已经为这个角度 DI 问题做了很多努力。我找到了一个解决方案,解决了导致 hasOwnProperty 错误(或旧 Angular 版本的“ɵprov”)的缺失依赖项。

与桶文件有关(解释here)。这些文件(名为 index.ts),有时无法正确解析(更多 here)。

我遇到了 hasOwnProperty 错误,试图了解为什么根据 Angular Router 文档构建的路由在 canActivate 属性中没有已解决的依赖项。

我的解决方案是更改该依赖项(服务)的导入。我在“app/core/auth/user-route-access-service”中将它从“app/core”(一个桶)更改为直接导入它。该服务是在 root 中提供的。

如何调试(使用 Angular 10 和 11 测试)

如果您不知道在哪里修复,这很有用。使用 Chrome,按 F12 打开开发者工具。打开记录错误的页面,然后单击 resolveNgModuleDep。

在您所在位置的上方添加logpoint

内容为“模块:”,data._moduleType.name

然后点击这里:

并在此处添加另一个日志点:

内容为“组件:”,futureARS.component.name,“canActivate=”,canActivate

按 F5 刷新页面

之后,您将能够找到组件(由模块名称包围),其路由具有无效的 canActivate 属性,从而产生了问题。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2019-04-28
    • 2015-02-18
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多