【问题标题】:Output from array by index returns undefined按索引从数组输出返回未定义
【发布时间】:2015-10-17 22:36:16
【问题描述】:

我正在尝试输出位于 json 对象中的数组的特定索引。

例如,我从 MongoDB 中获取了以下 json 对象

{ _id: 55b65199c92d15d80fd94803,
  site: 'test.com',
  company: 'test',
  __v: 0,
  votes: [
     { vote_user: '55a11de3e4c770982730ccb9' },
     { vote_user: '55a11de3e4c770982730612a' } 
  ] 
}

这个对象是从nodejs路由渲染传递过来的一个名为suggestions的对象,并且是通过EJS循环使用

 <% suggestion.forEach(function(item){ %><%}%>

在这个阶段,我尝试使用从投票数组中检索特定的 vote_user 对象

 <% suggestion.forEach(function(item){ %><%- item.votes[0] %><%})%>

然而,我得到的只是未定义

我尝试将“item”分配给一个 javascript 变量,然后将其记录到浏览器控制台,它完全按照我的意愿工作并期望它 - 因为我得到以下结果:

Object {vote_user: "55a11de3e4c770982730ccb9"}

真的无法理解为什么它不像我想象的那样工作。

编辑

由于有点不清楚设置的样子,下面是实际使用的代码:

EJS

<% suggestion.forEach(function(item, i){ %>
        <div class="suggestion-entry suggestion-<%- item._id %>" data-entry="<%- item._id %>">
            <!--<%- item %>-->
            <div class="entry-info">
                <div class="voting">
                    <script>
                        console.log(<%- item.votes %>[0].vote_user)
                    </script>
                    <%- item.votes[0].vote_user %>
                    <div class="vote vote-up"><a><i class="fa fa-chevron-up"></i></a></div>
                <div class="vote vote-down"><a><i class="fa fa-chevron-down"></i></a></div>
                </div>
                <div class="image"><img src='http://placehold.it/130x90.jpg'></div>
                <div class="company">
                    <h2><a href="<%= item.site %>"><%= item.company %></a></h2>
                    <span class="desc"><%= item.company %></span>
                </div>
            </div>
        </div>
    <% }); %>

脚本标签输出实际的 vote_user 值而不是 undefined。

Nodejs 路由

app.get('/', function(req, res) {
        Suggestion.find(function(err, suggestions){
            res.render('index', { message: req.flash('message'), title: "title", user : req.user, suggestion : suggestions });
        })
    });

MongoDB 文档和开头写的一样

【问题讨论】:

  • 既然item 给了你{vote_user: "55a11de3e4c770982730ccb9"},你的suggestion 变量似乎就是你的votes 数组。所以在某些时候你可能做了类似suggestion = myJson.votes
  • 谢谢@Jan。问题是,item 按预期返回整个对象。所以当我去item.votes 时,我得到了投票数组作为回报,所以在这种情况下[ { vote_user: '55a11de3e4c770982730ccb9' }, { vote_user: '55a11de3e4c770982730612a' } ]。如前所述,本机 javascript 似乎可以很好地处理这个问题,尽管当尝试对 EJS 做同样的事情时,它根本不起作用,我觉得这很奇怪。
  • 我不知道 EJS 的语法但是&lt;%- 应该是&lt;%= 吗?
  • 两者都试过了,但都没有比另一个更好。 &lt;%- 返回未转义的值,而 &lt;%= 返回已转义的值

标签: javascript arrays json node.js ejs


【解决方案1】:

所以,我终于设法解决了这个问题 - 我不确定为什么这个解决方案有效,但它确实有效。

根据@Jan 的建议,id 必须转换为字符串才能使 EJS 能够正确验证和使用 json 对象。

解决办法是先把node传过来的json对象串起来

app.get('/', function(req, res) {
    Suggestion.find(function(err, suggestions){
        res.render('index', { message: req.flash('message'), title: "title", user : req.user, suggestion : JSON.stringify(suggestions) });
    })
});

这会将所有对象和数组作为字符串返回,而不是为 mongo 中的值设置的数据类型。

为了能够处理字符串值,我随后在 EJS 中简单地将字符串化的建议变量解析为 JSON

JSON.parse(suggestion)

【讨论】:

    【解决方案2】:

    回答已编辑的问题:

    首先,您的id 需要是一个字符串。似乎问题在于使用&lt;%- 标签。也许你可以找到关于它应该如何工作的文档,但在网站上进行测试,这根本不起作用,而 &lt;%= 工作得很好。精简的概念证明:

    <%
    var suggestion = [{ _id: '55b65199c92d15d80fd94803',
      site: 'test.com',
      company: 'test',
      __v: 0,
      votes: [
         { vote_user: '55a11de3e4c770982730ccb9' },
         { vote_user: '55a11de3e4c770982730612a' } 
      ] 
    }];
    %>
    
    <% suggestion.forEach(function(item, i){ %>
    <div class="suggestion-entry suggestion-<%= item._id %>" data-entry="<%= item._id %>">
      <li><%= item.votes[0].vote_user %></li>
      <li><%= item.site %></li>
      <li><%= item.company %></li> 
    </div>
    <% }); %>
    

    将其粘贴到网站上的测试文本区域中,您会看到它有效。如果这仍然不适用于您的代码,则说明情况完全不同。

    【讨论】:

    • 感谢您深入挖掘并指出缺少的括号,在我提供的示例中缺少这个,但它在我正在使用的源中,否则会出错:) 另​​外,感谢您的建议,试一试,但 express 返回 无法调用未定义的方法 'forEach'。所以它几乎又回到了第一步。 :(
    • 另外,_id 是 Mongoose 自动创建的,与 MongoDB 相关联,它已经是一个字符串了。
    • 如果您将我发布的确切代码粘贴到 EJS 站点上的语法检查器中,它就可以工作。因此,如果您仍然遇到问题,则不是这部分。
    • 是的,你是对的。如果您直接使用 EJS 将对象分配给变量,它似乎可以工作,但由于某种原因,当对象从节点传递时,它不会,所以我有点不知所措。不过感谢您的努力。
    • ...它们可能在应用程序周期的不同时间执行? F.e 如果您的 EJS 在 DOM 加载时运行,而您的节点代码在文档加载时运行,EJS 将在对象存在之前执行?
    猜你喜欢
    • 2020-07-16
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多