为什么在带有nunjuck的mongoose对象中循环显示元数据?
我正在编写一个应用程序,使用MongoDB和Nunjuck。
我试图遍历一个名为persona的模型,但这样做会显示与记录关联的Mongoose元数据。
如果我只是通过编写persona来显示{{persona}}变量。
我的输出如下。只有在我的模式中定义的键/值。

{ _id: 582f186df1f05603132090d5, name: 'Alex', name_lower: 'alex', __v: 0,
meta: { validated: null, contributors: 'Research Team', sources: '4 Interviews' },
pain_points: { points: 'Debugging' },
ideal_day: { responsibilities: 'Coding websites.', goals: 'Finish the research site.', joys: 'Good code, Good food.', hobbies: 'Dance, Hiking, Eating' },
environment: { workspace: 'Desk', tools: 'Atom, Sketch', info_from: null, info_to: null, coworkers_relationship: null, technology_relationship: null },
basic_info: { jobtitle: 'FED', experience: '2', education: 'CS', company: '' } }

但是,如果我循环通过persona
{%表示名称,项目位于persona%}
{{name}}:{{item}
{%endfor%}
除了在我的模式中显示密钥外,还将显示与记录关联的所有Mongoose元数据。我想了解为什么在对象上循环时会显示不同的信息。
美元
是新的
错误
二博士
$保存
节约
小精灵
六柱
$验证
验证
删除$\u原始
去除
分贝
鉴别器
αv
身份证件
圣婴

痛点
理想的一天
环境
基本信息
更新时间
创建于
姓名下
名称
图式
收集
$汉德尔萨夫
节省美元
三角洲
$\u版本
增量
$在哪里
我可以通过使用Mongoose的lean()来解决这个问题,但是仍然不明白为什么我会经历这种行为。

最佳答案

当您调用{{persona}}时,结果是persona.toString()
如果对象没有override methodtoString,则结果将是[Object object](默认情况下toString方法)。
当使用loop{% for key, value in persona %}时,它等于

for(var key in obj)
  print(key + ' - ' + obj[key]);

此代码打印所有对象属性和方法。
若要排除方法,必须使用下一个循环
for(var key in obj)
  if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
      print(key + ' ' + obj[key]);

因此,为了避免您的问题,您必须在将数据传递给nunjuck或在输出之前“清除”数据。
你可以定义custom filter
var env = nunjucks.configure(...

env.addFilter('lean', function(obj) {
    var res = {};
    for(var key in obj)
        if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
           res[key] = obj[key];
    return res;
});
...
{% for key, value in persona | lean %}
{{key}} - {{value}}
{% endfor %}

关于node.js - 为什么通过Mongoose对象循环显示元数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40683140/

10-09 20:39