2013-12-19 21 views
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 
    }] 
} 

但它似乎已經失去了諸如'保存'方法。

任何想法?

回答

0

您將地址定義爲字典而不是地址對象。相反,你應該這樣做:

Order.methods.addAddress = function(type, data, next) { 

    // Have your removal code here 

    var self = this 
    var address = new Address(data) 
    address.save(function(err, address) { 
     if (err) { 
      ... 
     } else { 
      self.address.push(address) 
      next() 
     } 
    }) 
} 

請注意,我使用地址對象填充地址數組根據模式定義。

+0

事情是,它像一個字典一樣正常工作。 Tt將它拆除,打破了內部的某些東西。部分問題可能是我正在使用刪除而不是切片並離開..你怎麼稱之爲空物體的腐爛外殼,所以當地址長度爲2但在索引0處沒有任何東西時,貓鼬可能會嚇壞了 – cyberwombat

+0

是的,你可能是對的。從循環中的數組中刪除東西時總是一個問題。嘗試使用this.address [i] .delete()移除數組中的對象,使用foreach和或將要保存的地址添加到新數組,您可以使用this.address = newArray,試圖消除數組索引問題。 –

+0

哦,呵呵..我什至不認爲我的subdocs會有刪除()! – cyberwombat