2013-04-09 12 views
9

Öğrenme amaçlı node.js, mongoose ve omurga kullanarak bir todo uygulaması oluşturmaya çalışıyorum. Bir görevi ekleyerek için"Nesne {}, mongoose dizisine öğe eklemeye çalışırken" cast 'error "yöntemine sahip değil.

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); 

Buna ek olarak, ben de aşağıdaki yöntemi vardır: Şu ana kadar ben bu modelleri tanımlanan

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(); 
     } 
    }) 
} 

Ama gerçekten de bir görev eklemek, ben bir olsun diyor hatası:

"Nesne {} 'dökme' hayır yöntemi vardır" Aşağıdaki yığın izleme ile

:

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 

Sorun satırla olduğunu görünüyor ki görevleri diziye yeni görev.

Google'da ya da yığında hiçbir şey bulamadım, bu yüzden merak edenlerin neyin yanlış gittiğine dair bir fikri var mı?

Teşekkürler!

+2

o' görevler olması gerekmez mi? –

+2

siz doğru ... cevap olarak yazın ve kabul edeceğim. Teşekkürler! – Protostome

cevap

24

Bu hata AccountSchema tanımındadır. Bir alt belge türü, bir model değil, bir şema olmalıdır. Eğer şema doğrudan erişim var ve sadece modele erişimi yoksa

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

Ayrıca 'Somemodel.schema' da yapabilirim, bu genellikle – mrBorna

+0

yaptığım şeydi. Bu kesinlikle sorunumu çözdü. Yığın izimin de "undefined bir işlev değil" olduğu ve _cast hatasının yığın izinde gömülü olduğu için bunu bulmakta zorluk çekiyordum. –

2

Alternatif olarak, böyle nokta gösterimi ile modelin şemasını erişebilirsiniz:

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

budur başka bir dosyada şemayı tanımlarken ettik ve böyle bir şey kullanıyorsanız yararlı eğer: AccountSchema tanımında [TaskSchema] `yerine "Task" nin:

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

Teşekkürler! Büyük ek – CodyBugstein

İlgili konular