2013-05-22 9 views
24
Aşağıdaki şemalar var

kaydetme:Referans dokümanlar firavunfaresi

// ingredient 
var ingredSchema = new Schema({ 
    name: String, 
    cost: Number 
}); 

// order 
var orderSchema = new Schema({ 
    cusName: String, 
    ingredients: [{type: Schema.Types.ObjectId, ref: 'Ingredient'}] 
}); 

// create model 
var Ingredient = mongoose.model('Ingredient', ingredSchema); 
var Order = mongoose.model('Order', orderSchema); 

Zaten bir koleksiyon ingredients bir demet malzemeyi kaydedilir ve kullanıcılar kendi Burger maddeler kümesi seçin nerede bir UI sahibiz. Sonra bu gibi aynı veritabanında burgers içinde başka bir koleksiyona orders bir hamburger siparişi kaydetmeyi deneyin:

// get order info from the form 
var newOrder = new Order({ cusName: req.body.name, 
          ingredients: req.body.ingredients }); 
newOrder.save(function(err) { 
    if (err) 
     return console.log('Could not save your new order', err); 
    res.redirect('/order'); 
}); 

çağrı bir emir aşağıdaki hata üretir kaydetmek için:

{ message: Cast to ObjectId failed for value xxx at path 'ingredients', 
    name: 'CastError', 
    type: ObjectId, 
    value: xxx, 
    path: 'ingredients' } 

Ben mongoose kullanmak sürüm 3.6.11. Lütfen bunu kesmeme yardım et.

PS: req.body.ingredients, onay kutularından oluşturulan bir dizidir. Orada

cevap

22

şu anda koduyla 2 olası sorunlar şunlardır:

1. req.body.ingredientsObjectId s dizisi olmayacak ve firavunfaresi kapladı (ben bu elden şüphe) istiyor.

Her malzemeyi önce ObjectId'a dökmelisiniz. Sizin için çalışacağız, bakalım bu test vermedi

var casted = req.body.ingredients.map(function(ingredient) { 
    return mongoose.Types.ObjectId(ingredient); 
}); 

: req.body.ingredients Supposing o zaman böyle bir şey yapacağını dizidir.

2. Gelincik malzemeyi dökme çalışıyor, ama bir tanesi geçerli ObjectId

ObjectId sen Mongoose için böyle değerlerin geçirildiğinden olup olmadığını kontrol 24 altıgen karakter oluşmalıdır değil. `Hata: geçirilen Argüman 12 bayt veya bir tek dize olmalıdır bunlardan biri sizin için çalışmak eğer :)

+0

ben 1. seçeneği koştu ve ekspres bir hata atar


, sonuç sonrası Lütfen 24 hex karakter dizesi. Hala başımı bu 'ObjectId' şeyinin etrafına sarmaya çalışıyorum. – gabeno

+0

Eh, şimdi seçenek 2'yi işaretleyin. Geçerli 'ObjectId's geçmiyor olabilirsiniz. – gustavohenke

+3

Anladın! Seçenek iki bunu çivi. Sorun, "ingred._id" yerine "req.body.ingredients" içinde "ingred.name" değerine sahip olduğumdu. Başların için teşekkürler. – gabeno