javascript - 对象键未定义 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
解决方案
你的错误是你有<=
而不是<
. 让我说明原因。
假设您的帖子数组如下所示:
[
{ 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
,循环将停止,但它会被执行0
,1
并且2
。
您可能会注意到,现在这意味着访问了三个索引(和) 0
,尽管您的数组内部只有两个帖子(带有索引和)!1
2
0
1
在第三次迭代中,您正在访问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) %>
<% } %>
推荐阅读
- sass - Foundation 6 自定义调色板不起作用
- c# - 如何避免 ScriptableObject 数据结构更改时的数据丢失
- mysql - MySQL UNION 在 DataTables 中显示重复项
- twilio - 更改 Twilio Authy OTP 到期时间
- angular - Angular 组件中的 Emit 和 Catch 事件
- r - 将具有多个小数的数字字符串转换为R中的数字数据类型
- angular - Angular模板类绑定不一致
- asp.net-mvc - MVC 无需重定向即可登录 IdentityServer4
- javascript - Node.js dom-parser tagRegExp 正则表达式匹配挂起:灾难性回溯?
- php - 基于角色的访问控制究竟在哪里检查 MVC 模式中的用户权限?