【问题标题】:Why Does Looping Through a Mongoose Object Display Metadata?为什么循环通过 Mongoose 对象会显示元数据?
【发布时间】:2017-04-02 15:53:42
【问题描述】:

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

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

我正在尝试遍历名为 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

{% for name, item in persona %} {{名称}}:{{项目}} {% endfor %}

除了显示我的架构中的键之外,还将显示与记录关联的所有 mongoose 元数据。我想了解为什么在循环对象时会显示不同的信息。

$__ 是新的 错误 _doc $__original_save 保存 _pres _posts $__original_validate 证实 $__original_remove 消除 D b 鉴别器 __v ID _ID 元 痛点 理想日 环境 基础信息 更新时间 created_at name_lower 姓名 图式 收藏 $__handleSave $__保存 $__delta $__版本 增量 $__哪里

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

【问题讨论】:

    标签: node.js mongodb mongoose nunjucks


    【解决方案1】:

    当您调用{{persona}} 时,结果为persona.toString()
    如果对象没有覆盖方法toString,则结果将为[Object object](默认为toString 方法)。

    当你使用循环 {% 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]);
    

    因此,为避免您的问题,您必须在将数据传递给 nunjucks 或输出之前“清除”数据。
    你可以定义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 %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2015-11-29
      相关资源
      最近更新 更多