как проверить / перебрать объект в узле?

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

Когда я console.log объект, все хорошо (перечислены все ключи, не более того). Когда я выполняю for..in на объекте, скрытые поля появляются из ниоткуда (а интересующие клавиши - нет). В них есть смысл - они принадлежат мангусту - но они мне не нужны. То же самое происходит при использовании Object.keys или Object.getOwnPropertyNames в объекте - всплывающее окно скрытых полей, ничего полезного.

Поэтому я хотел проверить элемент с помощью util.inspect (obj, true, null, true) и записать результат в консоль. Результат на консоли такой же, как если бы я console.log записал объект напрямую без проверки.

Теперь два вопроса;

  1. Как правильно проверить объект, чтобы получить внутреннюю / скрытую информацию об объекте?
  2. Как я могу перебирать объект и получать только поля? (да, я провожу проверку hasOwnProperty в цикле for..in)

// РЕДАКТИРОВАТЬ

Ладно, я понял. После некоторого исследования я понял, что объект mongoose проксирует свои свойства и имеет функцию toJSON, которая объясняет, почему console.logs находится в ожидаемой структуре вывода. Решение состоит в том, чтобы использовать собственный метод toObject Mongoose;

mongooseObj.toObject({ getters: true, virtuals: false })

Таким образом, я могу перебирать Object.getOwnPropertyNames и заменять / удалять ключи, о которых клиент не должен знать!


person japrescott    schedule 08.03.2012    source источник
comment
Можете немного перефразировать свой вопрос? Мне трудно понять, о чем вы спрашиваете. Что вы имеете в виду под «скрытыми полями»? Это просто свойства, которые находятся выше по цепочке прототипов? Свойства, отмеченные как неперечислимые? Или свойства, начинающиеся с _underscore?   -  person ming_codes    schedule 09.03.2012


Ответы (2)


Я собираюсь предположить, что вы смотрите на объект Document, возвращаемый запросом мангуста, когда вы действительно просто хотите увидеть данные. Если мое предположение верно, вам, вероятно, понадобится что-то вроде этого:

Model.findOne({ name: 'john' }, function (err, doc) {
    var data = doc.toObject();

    // do whatever you need to with data
    delete data.age;
    delete data.weight;
    data.isAwesome = true;

    // now stringify the data and do something with it
    callback(JSON.stringify(data));
});
person abe    schedule 10.03.2012
comment
привет, спасибо за ответ. Я на самом деле только сейчас вижу, что в вашем ответе был toObject ... должен был видеть это с самого начала;) Спасибо за вашу помощь! - person japrescott; 10.03.2012

Также, если вы хотите получить доступ к определенному полю из документа, вы можете взглянуть на:

Document # get

// path
doc.get('age') // 47

// dynamic casting to a string
doc.get('age', String) // "47"
person janex    schedule 28.10.2013