2013-04-09 8 views
9

पर आइटम जोड़ने का प्रयास करते समय ऑब्जेक्ट {} में कोई विधि 'कास्ट' त्रुटि नहीं है। मैं सीखने के उद्देश्यों के लिए node.js, mongoose और रीढ़ की हड्डी का उपयोग करके एक todo ऐप बनाने की कोशिश कर रहा हूं। एक काम जोड़ने के लिए"ऑब्जेक्ट {} में मोंगोस सरणी

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

इसके अलावा, मैं भी निम्न विधि है: अब तक मैं इन मॉडलों परिभाषित

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

लेकिन जब मैं वास्तव में एक कार्य जोड़ने, मैं एक मिल त्रुटि है कि कहते हैं:

"ऑब्जेक्ट {} कोई विधि 'डाली' है"

निम्नलिखित स्टैक ट्रेस के साथ:

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 

ऐसा लगता है कि समस्या लाइन के साथ है कि कार्यों सरणी के लिए नया कार्य।

Google या स्टैक पर कुछ भी नहीं मिला, इसलिए मुझे आश्चर्य है, क्या किसी को गलत क्या है इसके बारे में कोई जानकारी है?

धन्यवाद!

+2

यह 'नहीं होना चाहिए कार्यों: AccountSchema परिभाषा [TaskSchema]" टास्क "के बजाय'? –

+2

आप सही हैं ... इसे एक उत्तर के रूप में लिखें और मैं इसे स्वीकार करूंगा। धन्यवाद! – Protostome

उत्तर

24

त्रुटि खातास्केमा परिभाषा में है। एक उप-दस्तावेज़ प्रकार एक स्कीमा होना चाहिए, मॉडल नहीं।

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

आप 'Somemodel.schema' भी कर सकते हैं जो मैं आमतौर पर – mrBorna

+0

करता हूं यह इस बिंदु पर था! यह निश्चित रूप से मेरी समस्या तय कर दिया। मुझे यह खोजने में परेशानी थी, हालांकि मेरे स्टैक ट्रेस में भी "अपरिभाषित एक समारोह नहीं था" और _cast त्रुटि को स्टैक ट्रेस में कुछ हद तक दफनाया गया था। –

2

फिर, आप अपने स्कीमा के लिए सीधी पहुँच नहीं है, तो, और केवल मॉडल के लिए उपयोग किया है, तो आप मॉडल स्कीमा डॉट नोटेशन के साथ इस तरह का उपयोग कर सकते हैं:

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

यह वह जगह है सहायक यदि आप किसी अन्य फाइल में अपना स्कीमा है और कुछ इस तरह का प्रयोग कर रहे:

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

धन्यवाद! महान जोड़ – CodyBugstein

संबंधित मुद्दे