---
详细解释为什么会出现"Cannot read properties of undefined (reading 'toString')"错误,以及如何修复这个问题
2023-11-14
作者:naiko

你在访问博客页面时遇到了错误,从终端输出可以看到:
23:06:19 [ERROR] Cannot read properties of undefined (reading 'toString')
Stack trace:
at D:\learn\blognew\blognai\src\pages\blog.astro:19:72
at Object.default (D:\learn\blognew\blognai\src\pages\blog.astro:16:8)
[...] See full stack trace in the browser, or rerun with --verbose.
通过查看src/pages/blog.astro文件的代码,我发现了两个问题:
主要错误:在第19行,代码尝试对可能是undefined的属性调用toString()方法:
<li><a href={pos.url}>{pos.frontmatter.title} {pos.frontmatter.pubDate.toString().substring(0,10)}</a>></li>
错误信息”Cannot read properties of undefined (reading ‘toString’)“意味着pos.frontmatter.pubDate是undefined,所以当代码尝试调用toString()方法时就会失败。
语法错误:在第20行,<a>标签闭合后有一个多余的>符号:
</a>></li>
这个错误通常发生在以下情况:
undefined或nullpubDate属性pubDate属性调用toString()方法时,就会抛出错误要修复这个问题,我们可以使用**可选链操作符(?.)和空值合并操作符(??)**来安全地处理可能不存在的属性:
<li><a href={pos.url}>{pos.frontmatter.title} {pos.frontmatter.pubDate?.toString().substring(0,10) ?? ''}</a></li>
同时,我们需要移除多余的>符号。
可选链操作符(?.)是JavaScript中的一个特性,它允许你安全地访问嵌套对象的属性,即使中间的属性不存在。
当你使用obj?.prop时:
obj是undefined或null,表达式会直接返回undefined,而不是抛出错误obj存在,则返回obj.prop的值空值合并操作符(??)用于提供一个默认值,当左侧表达式的值为null或undefined时使用。
在我们的案例中,如果pubDate不存在,我们可以提供一个空字符串作为默认值,这样页面上就不会显示”undefined”。
使用可选链操作符:在pubDate后添加?.,这样当pubDate不存在时,表达式会返回undefined而不是抛出错误
pos.frontmatter.pubDate?.toString()
添加默认值:使用空值合并操作符(??)提供一个默认值,这样当日期不存在时,页面上不会显示”undefined”
{pos.frontmatter.pubDate?.toString().substring(0,10) ?? ''}
移除多余的符号:删除</a>>中的多余>符号,使其变成正确的</a>
修复后的代码应该是这样的:
<li><a href={pos.url}>{pos.frontmatter.title} {pos.frontmatter.pubDate?.toString().substring(0,10) ?? ''}</a></li>
除了使用可选链操作符,你还可以使用传统的条件检查来避免这个错误:
<li><a href={pos.url}>{pos.frontmatter.title} {pos.frontmatter.pubDate ? pos.frontmatter.pubDate.toString().substring(0,10) : ''}</a></li>
这种方法使用三元运算符来检查pubDate是否存在,如果存在则调用toString()方法,否则返回空字符串。
“Cannot read properties of undefined (reading ‘toString’)“错误发生是因为代码尝试对可能不存在的pubDate属性调用toString()方法。通过使用可选链操作符(?.)和空值合并操作符(??),我们可以安全地处理这种情况,避免错误的发生。同时,我们还需要修复HTML标签中的语法错误。
记住,在处理可能不存在的属性时,始终使用安全的访问方法,这将使你的代码更加健壮和可靠。