2013-03-15 14 views
5

Ho una semplice classe JS:Problemi memorizzazione funzioni JS in Mongo DB con Node.js

var User = function(id){ 
    this._id = id; 
    this.sayHello = function(){ 
     return "hello"; 
    } 
} 

Ho poi vado a conservarlo in MongoDB utilizzando il driver di default Node.js:

users.insert(new User(1)); 

Infine, recuperare l'utente, e cercare di eseguire la funzione:

users.findOne({_id:1}, function(err, item) { 
    console.log("Say hello: " + item.sayHello()); 
}); 

ricevo il seguente errore, che è davvero confusa:

throw err; 
     ^
TypeError: Object #<Object> has no method 'sayHello' 

Sono totalmente perso su questo. La mia comprensione è che MongoDB ha memorizzato sia le funzioni JS sia le proprietà così come sono. Se questo non è il caso, puoi consigliare come posso aggirare questo problema?

Grazie!

+0

il tuo esempio funziona per me tramite la shell mongo. Nessun errore che sia mai stato fatto e sayHello() viene invocato correttamente. – zeusdeux

+0

@zeusdeux la domanda riguarda 2 processi: mongodb e un processo del server delle applicazioni node.js separato. La shell mongo è un'utilità di sviluppo. Questa domanda riguarda la creazione di un'applicazione in node.js. –

+0

@peter si ho capito. I metodi dell'oggetto vengono serializzati prima di essere archiviati comunque, quindi con ogni probabilità il risultato non dovrebbe differire a prescindere da dove viene eseguito, che si tratti del client mongo o di un'app nodo. Lo proverò da un'app oggi per sicurezza. – zeusdeux

risposta

9

Mongo non può memorizzare funzioni (codice), solo dati. Prendi i dati grezzi che ricevi e passali a una funzione di costruzione, o considera un ODM come mangusta.

Ci sono un insieme molto specifico e limitato di condizioni in cui è possibile inviare il codice di funzione mongo in forma di stringa e farlo valutare sul server. Questi sono documentati in the MongoDB manual. Tuttavia, lo scopo di quel codice in esecuzione all'interno di mongo è di supportare sofisticate operazioni di query sui dati, non di modellizzare la logica dell'applicazione, che è ciò a cui si pone questa domanda. La logica dell'applicazione va nel file node.js .js file. I dati vanno nel database.

+3

MongoDB può effettivamente memorizzare il codice. – zeusdeux

+0

http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html – Joe

+1

Sono d'accordo con la modifica. Separare la logica e i dati dell'applicazione su cui lavora. Invia i dati a mongodb e alla logica delle app nei moduli all'interno della tua app. – zeusdeux