2012-03-08 17 views
5

Otrzymuję wynik (obiekt) z zapytania mongoose i chcę wymienić/usunąć niektóre klucze, zanim sklasyfikuję obiekt i wyślę go do klienta.jak sprawdzić/iterować nad obiektem w węźle?

Kiedy konsoli.log obiektu, wszystko jest miłe (wszystkie klucze są wymienione, nic więcej). Kiedy robię a..in na obiekcie, ukryte pola wyskakujące znikąd (i klucze interesujące, nie). Mają sens - należą do mangusty - ale ja ich nie chcę. To samo dzieje się podczas używania Object.keys lub Object.getOwnPropertyNames w Object - ukryte pola popup, żadne z nich nie przydaje się.

Tak więc chciałem sprawdzić element za pomocą util.inspect (obj, true, null, true) i zalogować wynik do konsoli. Wynik na konsoli jest taki sam, jak gdybym konsola. Zablokował obiekt bezpośrednio bez kontroli.

Teraz dwa pytania;

  1. Jak poprawnie sprawdzić obiekt, aby uzyskać wewnętrzne/ukryte informacje o obiekcie?
  2. Jak mogę iterować po obiekcie i uzyskać tylko pola? (Tak, robię czek hasOwnProperty w pętli for..in)

// EDIT

OK, rozumiem. Po pewnym dochodzeniu zdałem sobie sprawę, że obiekt mangusty prosi o swoje właściwości i ma funkcję toJSON, co wyjaśnia, dlaczego konsola.logs była w oczekiwanej strukturze wyjściowej. Rozwiązaniem jest użycie metody Mongoose toObject;

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

ten sposób mogę iteracyjne nad Object.getOwnPropertyNames i wymienić/wyjąć kluczyki nie chcę klienta wiedzieć o!

+0

Czy możesz zmienić nieco swoje pytanie? Trudno mi zrozumieć, o co prosisz. Co rozumiesz przez "ukryte pola"? Czy to tylko właściwości, które są wyżej w łańcuchu prototypów? Właściwości oznaczone jako nieprzeliczalne? Lub właściwości zaczynające się od _underscore? –

Odpowiedz

4

Idę się domyślić, że jesteś patrząc na Dokument obiektu zwróconego przez kwerendę mangusty jeśli naprawdę chcesz zobaczyć dane. Jeśli moje przypuszczenie jest prawidłowe, prawdopodobnie będziesz chciał coś takiego:

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)); 
}); 
+1

hej abe, dziękuję za odpowiedź. Dopiero teraz widzę, że miałeś toObject w swojej odpowiedzi ... powinieneś to widzieć od początku;) Dzięki za twoją pomoc! – japrescott

0

Także jeśli chcesz uzyskać dostęp do jakiegoś pola z Dokumentu można spojrzeć na:

Document#get

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

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