2016-11-18 3 views
2

Почему цикл через объект mongoose с метаданными отображения nunjucks?Почему происходит циклическое отображение метаданных в метаданных?

Я использую 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

 

    {% for name, item in persona %} 
     {{ name }} : {{ item }} 
    {% endfor %} 

В дополнение к отображению ключи в моей схеме, также будут отображаться все метаданные мангуст, связанные с записью. Я хотел бы понять, почему различная информация отображается, когда я перебираю объект над объектом.

 

    $__ 
    isNew 
    errors 
    _doc 
    $__original_save 
    save 
    _pres 
    _posts 
    $__original_validate 
    validate 
    $__original_remove 
    remove 
    db 
    discriminators 
    __v 
    id 
    _id 
    meta 
    pain_points 
    ideal_day 
    environment 
    basic_info 
    updated_at 
    created_at 
    name_lower 
    name 
    schema 
    collection 
    $__handleSave 
    $__save 
    $__delta 
    $__version 
    increment 
    $__where 

Я был в состоянии решить эту проблему с помощью Мангуст-х lean(), но до сих пор не понимаю, почему я испытал это поведение.

ответ

2

Когда вы позвоните, {{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 %} 
Смежные вопросы