2012-11-10 5 views
5

Mam pewne informacje na temat moich modeli mangusty, które są przejściowe. Ze względów wydajnościowych nie chcę przechowywać go na modelu. Ale chcę być w stanie przekazać te informacje klientom, którzy łączą się z moim serwerem i proszą o niego.Mongoose key/val ustawione na instancji nie są wyświetlane w JSON lub konsoli .. dlaczego?

Oto prosty przykład:

var mongoose = require('mongoose'), 
    db = require('./dbconn').dbconn; 

var PersonSchema = new mongoose.Schema({ 
    name : String, 
    age  : Number, 
}); 

var Person = db.model('Person', PersonSchema); 
var fred = new Person({ name: 'fred', age: 100 }); 

Schemat Osoba ma dwie cechy, które chcę zapisać (imię i wiek) .. to działa .. i widzimy w konsoli:

console.log(fred); 

{name: 'Fred', wiek: 100, _id: 509edc9d8aafee8672000001}

zrobić jednak mieć jeden atrybut ("status"), który szybko się zmienia i nie chcę tego przechowywać w bazie danych .. ale chcę go śledzić dynamicznie i dostarczać go klientom, więc dodaję go do instancji jako parę klucz/wartość.

fred.status = "alive"; 

Jeśli spojrzymy na fred w konsoli ponownie po dodaniu klucza "żywy"/Val parę znów widzimy Fred, ale pokazano jego isnt cywilny:

{nazwa: 'Fred', wiek: 100, _id: 509edc9d8aafee8672000001}

Jeszcze parę klucz/val jest zdecydowanie tam .. widzimy, że:

console.log(fred.status); 

renderuje:

żyje

To samo reprezentacji JSON obiektu, który wyślę do klientów .. "status" existing włączonych ..

Nie rozumiem, dlaczego .. czy ktoś może pomóc?

Czy alternatywnie istnieje lepsze podejście do dodawania atrybutów do schematów mang, które nie są przechowywane w bazie danych?

+0

myślę, że to jest coś, ekscentryczne z obiektami Mongoose. Zawsze dołączam user.avatar do ich adresu URL gravatar. – chovy

Odpowiedz

9

dodanie następujących do schemacie powinien robić to, co chcesz:

PersonSchema.virtual('status').get(function() { 
    return this._status; 
}); 

PersonSchema.virtual('status').set(function(status) { 
    return this._status = status; 
}); 

PersonSchema.set('toObject', { 
    getters: true 
}); 

Dodaje atrybut wirtualny status - to nie będzie trwało, bo to jest wirtualny. Ostatnia część jest potrzebna, aby poprawnie wyświetlić dane wyjściowe dziennika konsoli. Od docs:

mieć wszystkie virtuals pokazać się w swoim wyjściu console.log ustaw toObject opcję na {pobierające: true}

Należy również zauważyć, że trzeba użyć właściwość wewnętrzną nazwa inna niż status (tutaj użyłem _status). Jeśli użyjesz tej samej nazwy, wprowadzisz nieskończoną pętlę rekurencyjną podczas wykonywania get.

+0

Fajnie .. wielkie dzięki! Działa jak smakołyk, idealnie. –

+0

Ciekawy .. pojawia się w konsoli ... aż do nie pokazuje w JSON wysłany do klienta .. –

+1

Możesz wywołać 'toObject' na swoim wystąpieniu przed wysłaniem danych. Wolę przesłonić 'toJSON' jak widać [tutaj] (https://groups.google.com/d/topic/mongoose-orm/SHe_Fsso_44/discussion). –

1

Wystarczy wywołać .toObject() na obiekcie danych.

dla Ciebie kod będzie tak:

fred.toObject()

Powiązane problemy