0
我有一個模式和一個方法 - 2個變體。在第一次添加地址時,它們都可以正常工作,但在添加另一個地址時(即,當它通過for循環時),版本1會崩潰。我的意思是,它似乎破壞了我的訂單實例 - 沒有更多的「保存」方法。當覆蓋子文檔時Mongoose模式/方法消失
架構
var Address = new Schema({
type: { type: String, enum: ['shipping', 'billing'] },
street: { type: String, required: true },
city: { type: String, required: true },
region: String,
country: String,
postal: { type: String, required: true },
});
var Order = new Schema({
email: {
type: String
},
address: [Address]
});
現在,如果我增加了一個addAddress()方法來我的架構。這是我嘗試過的兩個版本。
// Version 1 - has issues on subsequent call
Order.methods.addAddress = function() {
var data = { type: 'shipping', city: 'Tempe', postal: '85281', street: '420 Mill Ave'};
for(var i = this.address.length-1; i >=0; i--) {
if(this.address[i].type === type) {
delete address[i];
}
}
this.address.push(data);
}
// Version 2 - works fine
Order.methods.addAddress = function() {
var data = { type: 'shipping', city: 'Tempe', postal: '85281', street: '420 Mill Ave'};
var found = false;
for(var i = this.address.length-1; i >=0; i--) {
if(this.address[i].type === type) {
found = true;
this.address[i] = data;
}
}
if(!found)
this.address.push(data);
}
嘗試使用V1,將產生這個錯誤後保存:
Uncaught Exception
TypeError: Object #<Object> has no method 'save'
at /var/node_modules/mongoose/lib/document.js:1270:13
at Array.forEach (native)
at model.pre.err.stack (/var/node_modules/mongoose/lib/document.js:1252:12)
at model._next (/var/node_modules/mongoose/node_modules/hooks/hooks.js:50:30)
at model.proto.(anonymous function) [as save] (/var/node_modules/mongoose/node_modules/hooks/hooks.js:96:20)
at Promise.<anonymous> (/var/controllers/cart.js:79:11)
at Promise.<anonymous> (/var/node_modules/mongoose/node_modules/mpromise/lib/promise.js:171:8)
at Promise.EventEmitter.emit (events.js:95:17)
at Promise.emit (/var/node_modules/mongoose/node_modules/mpromise/lib/promise.js:88:38)
at Promise.fulfill (/var/node_modules/mongoose/node_modules/mpromise/lib/promise.js:101:20)
讓我們以下面的代碼:
Order.findById(id.exec(function(err, o) {
o.addAddress('shipping', { street: '1000 Mill Ave', city: 'Tempe', postal: '85281' });
console.log(o);
o.save(function(err, order) {
});
})
通知控制檯呼叫?在每一個變化看來,訂單對象是好的:
{
_id: 007d0000b10000000000000c,
address: [{
street: '420 Mill Ave',
postal: '85281',
city: 'Tempe',
type: 'shipping'
_id: 52b2459f1547a5e12300000b
}]
}
但它似乎已經失去了諸如'保存'方法。
任何想法?
事情是,它像一個字典一樣正常工作。 Tt將它拆除,打破了內部的某些東西。部分問題可能是我正在使用刪除而不是切片並離開..你怎麼稱之爲空物體的腐爛外殼,所以當地址長度爲2但在索引0處沒有任何東西時,貓鼬可能會嚇壞了 – cyberwombat
是的,你可能是對的。從循環中的數組中刪除東西時總是一個問題。嘗試使用this.address [i] .delete()移除數組中的對象,使用foreach和或將要保存的地址添加到新數組,您可以使用this.address = newArray,試圖消除數組索引問題。 –
哦,呵呵..我什至不認爲我的subdocs會有刪除()! – cyberwombat