2013-05-22 10 views
24

Mam następujące schematy:Dokumenty źródłowe z objectID przy zapisie w mangusta

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

już zapisane składniki pęczek w kolekcji ingredients i mają UI, gdzie użytkownicy wybrać zestaw składników do ich hamburgery. I następnie spróbuj zapisać zlecenie na hamburgera w innej kolekcji orders w tej samej bazie danych burgers tak:

// 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'); 
}); 

wywołanie zapisać rozkaz generuje następujący błąd:

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

używam mongoose wersja 3.6.11. Pomóż mi to zhakować.

PS: req.body.ingredients jest tablicą zbudowaną z pól wyboru.

Odpowiedz

22

Istnieją 2 możliwe problemy z kodem właśnie teraz:

1. req.body.ingredients nie będzie tablicą ObjectId s, a mangusta chce to w porządku (wątpię o tym).

Najpierw należy oddać każdy składnik do ObjectId. Przypuśćmy req.body.ingredients jest tablicą, wtedy można zrobić coś takiego:

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

nie przetestowane, zobaczyć, czy to będzie pracować dla Ciebie.

2. Mongoose próbuje oddać swoje składniki, ale jeden z nich nie jest poprawnym ObjectId

ObjectId powinna składać się z 24 znaków hex, sprawdź czy jesteś przechodzącą wartości jak to Mongoose.


Proszę pisać na wynik, jeśli jeden z nich pracuje dla ciebie :)

+0

Pobiegłem opcję 1 i wyrazić zgłasza błąd: 'Error: Argument przekazany musi być pojedynczym String 12 bajtów lub ciąg 24 znaków szesnastkowych'. Nadal staram się owijać głowę wokół tego "ObjectId". – gabeno

+0

Sprawdź teraz opcję 2. Nie możesz przekazywać poprawnych 'ObjectId's. – gustavohenke

+3

Masz to! Opcja druga to gwoździe. Problem polegał na tym, że miałem 'ingred.name' zapełnione w' req.body.ingredients' zamiast 'ingred.id '. Dzięki za heads up. – gabeno

Powiązane problemy