首页 > 解决方案 > 对象键未定义 javascript/ejs

问题描述

我有一个名为 posts 的数组,它包含一个对象:

var posts = []

app.get('/', function(req, res) {
    res.render('home', {
        homestct: homeStartingContent,
        posts: posts
    })
})

app.post('/compose', function(req, res) {
    const comp = {
        title: req.body.compTitle,
        post: req.body.compPost
    }
    posts.push(comp)
    res.redirect('/')

})

当我尝试检索密钥时: home.ejs 中的标题 =

    <% for (var i = 0; i <= posts.length; i++) { %>
        <% console.log(posts[i].title) %>
            <% } %>

它给了我错误:无法读取未定义的属性“标题”

请帮忙T_T

标签: javascriptnode.jsarraysjavascript-objectsejs

解决方案


你的错误是你有<=而不是<. 让我说明原因。

假设您的帖子数组如下所示:

[
  { title: 'A', post: 'a' }, // This will be posts[0]
  { title: 'B', post: 'b' }  // This will be posts[1]
]

你有两个帖子,所以posts.length会有2。第一个帖子是posts[0],第二个帖子是posts[1]

既然你这样做for (var i = 0; i <= posts.length; i++)了,这意味着你的循环只会在i <= posts.length不再为真时停止,这意味着如果i <= 2不再为真,即当i到达时3,循环将停止,但它会被执行01并且2

您可能会注意到,现在这意味着访问了三个索引(和) 0,尽管您的数组内部只有两个帖子(带有索引和)!1201

在第三次迭代中,您正在访问posts[2]which is undefined。这意味着读取尝试posts[2].title失败,因为它本质上尝试读取undefined.title这是不可能的,因此错误Cannot read property 'title' of undefined

底线:当你有一个从零开始的索引(从 开始0)并且你有元素总数作为限制器(.length例如来自)时,你总是需要使用<而不是<=确保你停止一个短于长度的索引, 因为最后一个索引总是length - 1.

建议:您可以使用以下方法迭代元素本身,而不是搞乱索引for ... of

    <% for (const post of posts) { %>
        <% console.log(post.title) %>
    <% } %>

推荐阅读