为什么通过猫鼬对象循环显示元数据



为什么使用nunjucks循环遍历mongoose对象会显示元数据?

我在一个应用程序中使用mongodb和nunjucks我正在编写。

我正在尝试迭代一个名为persona的模型,但这样做会显示与记录相关的猫鼬元数据。

如果我只是通过写入{{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

<>之前{%代表角色中的名称、项目%}{{name}}: {{item}}{% endfor %}之前

除了在我的模式中显示键之外,还将显示与该记录相关的所有mongoose元数据。我想了解为什么当我在对象上循环时显示不同的信息。

<>之前美元__isNew错误_doc__original_save美元保存_pres_post__original_validate美元验证__original_remove美元删除db鉴别器__vid_id元pain_pointsideal_day环境basic_infoupdated_atcreated_atname_lower名字模式集合__handleSave美元__save美元__delta美元__version美元增量__where美元之前

我能够通过使用Mongoose的lean()来解决这个问题,但仍然不明白为什么我遇到这个行为。

当你调用{{persona}}时,结果是persona.toString()
如果对象没有覆盖方法toString,那么结果将是[Object object](默认的toString方法)。

当你使用循环{% for key, value in persona %}时,它等于

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

此代码打印所有对象属性和方法。

要排除方法,必须使用next循环

for(var key in obj)
  if (typeof(obj) != 'function') // or obj.hasOwnProperty(key)
      print(key + ' ' + obj[key]);

所以,为了避免你的问题,你必须在将数据传递给nunjacks之前或在输出之前"清除"数据。
你可以这样定义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 %}

最新更新