ng 构建消息“无法读取未定义的属性 'toLowerCase' 中的错误”

Posted

技术标签:

【中文标题】ng 构建消息“无法读取未定义的属性 \'toLowerCase\' 中的错误”【英文标题】:ng build message "ERROR in Cannot read property 'toLowerCase' of undefined"ng 构建消息“无法读取未定义的属性 'toLowerCase' 中的错误” 【发布时间】:2020-05-07 05:33:19 【问题描述】:

我正在使用 Azure DevOps YAML 管道来构建/部署我的 Angular 9 应用程序。 YAML 包含一个 Powershell 脚本来构建它,如下所示

- powershell: |
    $angularBuildConfiguration = "MyBuildConfig";

    write-host "ng-build start";
    ng build --prod --aot --configuration $angularBuildConfiguration;
    write-host "ng-build end";

  workingDirectory: '$(Build.SourcesDirectory)\...'
  displayName: 'Build app - Angular app'

以上内容通过 Angular 构建,最后返回消息“ERROR in Cannot read property 'toLowerCase' of undefined”。

我已验证 workingDirectory 和 angularBuildConfiguration 参数具有预期的值 - 我也已将它们替换为硬编码值并获得相同的结果。如果我在构建服务器(实际运行 YAML 脚本的位置)上运行上面的 Powershell 脚本,则在预期的文件夹中构建失败并显示相同的错误消息,但是如果我在本地计算机上使用相同的脚本构建它会成功构建

我不知道这是否是一个 ng 构建问题,或者我的 Angular 9 项目中是否存在导致错误的东西 - 没有标记伴随错误消息的“关联”文件

有人有什么想法吗?

【问题讨论】:

我也有同样的问题。它甚至没有显示行号 我也有同样的问题。我通过删除 --prod 解决了这个问题,但这不是解决方案。 【参考方案1】:

这真的很随机​​ - toLowerCase 消息没有引用任何 javascript/typescript 代码 - 它必须是内部消息。我可以通过消除过程查明问题出在哪里的唯一方法 - 即一次取出一批网页,直到我得到一个干净的产品编译 - 然后再包括一个一个地工作以找到罪魁祸首。

存在导致问题的样式 - 我们替换了以下样式

.gridlines-left 
  border: 1px solid #c0c0c0;
  border-right-width: 0;
  border-top-width: 0;
  border-bottom-width: 0;

...与

.gridlines-left 
  border: 1px solid #c0c0c0;
  border-right-style: none;
  border-top-style: none;
  border-bottom-style: none;

...编译成功。我仍然不知道如何/为什么,因为我们有很多非常相似的其他样式,并且使用了相同的设置border-right/left/bottom/top-width: 0 的策略——这可能与我们如何组合css有关类 - 某些样式可能会在编译时与其他样式发生冲突 - 谁知道呢,但现在一切正常,从那以后就没有问题了

【讨论】:

【参考方案2】:

将字符串变量转换为小写时代码库中存在错误。 简单地说,它试图将 undefined 或 false 值转换为小写。

要使用小写的 JavaScript 内置函数,变量应该是真值。

所以在代码库中搜索它,然后像下面这样更新它。

If (variable) 
    variable = variable.toString().tolowercase();

【讨论】:

感谢 JuCheng - 问题并不是关于为什么代码的特定部分会导致问题 - 而是关于为什么它被“ng build”标记 - 错误消息“无法读取属性'toLowerCase' of undefined" 是一条运行时消息——我正在运行编译——“ng build”是否真的知道我的代码的哪些部分导致了这些类型的错误,或者 ng build 内部是否存在引发错误的东西? (如果它是我代码的一部分,为什么它不标记导致问题的文件?) 是的。 ng build 编译,它将通过代码库一一运行。在运行ng build 时,如果出现问题,它只会抛出错误并结束构建过程。如果那不存在特定的问题文件名,但我当然认为代码库中存在问题。我建议检查) 嗨 JuCheng - 我不相信“ng build”会产生此消息,因为正在编译的代码库不包含对未定义的检查 - 我已经完成了全局搜索和替换所有代码库中 ".toLowerCase()" 的实例并替换为 "" - 然后使用上面的 ng 构建脚本重新编译,仍然得到相同的错误消息

以上是关于ng 构建消息“无法读取未定义的属性 'toLowerCase' 中的错误”的主要内容,如果未能解决你的问题,请参考以下文章

ng 构建

在 syslog-ng 中抑制重复消息到 SQL 目标

使用 ng-zorro 构建动态菜单

Angular js - 如果 ng-repeat 为空则显示消息

ec2 构建框中的 Ng 构建问题,但在本地没有

在 ng-if 上的跨平台应用程序中延迟显示 UI