2013-04-09 13 views
9

Sto provando a creare un'app per il todo utilizzando node.js, mangusta e backbone per scopi di apprendimento. Fino ad ora ho definito questi modelli:"L'oggetto {} non ha alcun metodo 'cast' errore" durante il tentativo di aggiungere un elemento all'arena mangusta

var TaskSchema = new mongoose.Schema({ 
    title: { type:String }, 
    content: { type:String } , 
    created: {type:Date, 'default':Date.now}, 
    due: {type:Date}, 
    accountId: {type:mongoose.Schema.ObjectId} 
}); 

var Task = mongoose.model('Task',TaskSchema); 

var AccountSchema = new mongoose.Schema({ 
    email: { type:String, unique: true}, 
    password: { type:String } , 
    name: { first: {type:String}, 
     last: { type:String } }, 
    birthday: { 
     day: {type:Number, min:1, max:31, required:false}, 
     month: {type:Number, min:1, max:12, required:false}, 
     year: {type:Number} 

    }, 
    photoUrl: {type:String}, 
    biography:{type:String}, 
    tasks:[Task] 
}); 

var Account = mongoose.model('Account',AccountSchema); 

Inoltre, ho anche il seguente metodo per l'aggiunta di un compito:

var enter_new_task = function(options,callback){ 
    var title = options.title; 
    var content = options.content; 
    var due = options.due; 
    var account = options.account; 
    var task = new Task({ 
     title: title, 
     content: content, 
     due: due, 
     accountId: account._id 
    }); 
    account.tasks.push(task); 
    account.save(function(err) { 
     if (err) { 
      console.log("Error while saving task: " + err); 
     }else{ 
      callback(); 
     } 
    }) 
} 

Ma quando ho davvero aggiungere un'attività, ottengo una di errore che dice:

"oggetto {} non ha un metodo 'cast'"

Con la seguente analisi dello stack:

at Array.MongooseArray._cast (/home/lior/workspace/todo_express/node_modules/mongoose/lib/types/array.js:107:30) 
    at Object.map (native) 
    at Array.MongooseArray.push (/home/lior/workspace/todo_express/node_modules/mongoose/lib/types/array.js:261:23) 
    at Object.enter_new_task (/home/lior/workspace/todo_express/models/Account.js:107:17) 
    at /home/lior/workspace/todo_express/app.js:104:18 
    at Promise.<anonymous> (/home/lior/workspace/todo_express/models/Account.js:41:4) 
    at Promise.<anonymous> (/home/lior/workspace/todo_express/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (/home/lior/workspace/todo_express/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (/home/lior/workspace/todo_express/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
9 

sembra che il problema è con la linea che la nuova attività alla matrice compiti.

Impossibile trovare qualcosa su google o stack quindi mi chiedo, qualcuno ha un'idea di cosa è andato storto?

Grazie!

+2

non dovrebbe essere 'compiti: [TaskSchema]' al posto di "Task" nella definizione AccountSchema? –

+2

hai ragione ... scrivilo come risposta e lo accetto. Grazie! – Protostome

risposta

24

L'errore è nella definizione di AccountSchema. Un tipo di documento secondario deve essere uno schema, non un modello.

var AccountSchema = new mongoose.Schema({ 
    //... 
    tasks:[TaskSchema] 
}); 
+2

Si potrebbe anche fare 'Somemodel.schema', che è quello che faccio di solito – mrBorna

+0

Questo era così sul punto! Ha risolto definitivamente il mio problema. Ho avuto difficoltà a trovare questo però dal momento che la mia traccia di stack aveva anche "indefinito non è una funzione" in esso e l'errore _cast era un po 'sepolto nella traccia dello stack. –

2

In alternativa, se non si ha accesso diretto al tuo schema, e hanno solo accesso al modello, è possibile accedere schema del modello con la notazione punto in questo modo:

var AccountSchema = new mongoose.Schema({ 
    //... 
    tasks:[Task.schema] 
}); 

Questo è utile se avete definito lo schema in un altro file e si utilizza qualcosa di simile:

module.exports = mongoose.model('Task', TaskSchema); 
+0

Grazie! Grande aggiunta – CodyBugstein

Problemi correlati