24

次のスキーマがあります。

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

私はすでにたくさんの食材をコレクションに保存しておりingredients、ユーザーがハンバーガーの食材のセットを選択する UI を持っています。次に、次のようordersに、同じデータベース内の別のコレクションにハンバーガーの注文を保存しようとします。burgers

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

注文を保存するための呼び出しにより、次のエラーが生成されます。

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

私はマングースのバージョン 3.6.11 を使用しています。これをハックするのを手伝ってください。

PS: req.body.ingredients は、チェックボックスから構築された配列です。

4

1 に答える 1

24

現在、コードには 2 つの問題が考えられます。

1.req.body.ingredientsは s の配列ではなくObjectId、マングースはそれを望んでいます (私はこれを疑っています)。

ObjectIdすべての材料を最初にキャストする必要があります。が配列であると仮定するreq.body.ingredientsと、次のようになります。

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

私はこれをテストしていません。うまくいくかどうかを確認してください。

2. マングースが材料をキャストしようとしていますが、そのうちの 1 つが有効ではありませんObjectId

ObjectId24 個の 16 進文字で構成されている必要があります。このような値を Mongoose に渡しているかどうかを確認してください。


それらの1つがあなたのために働くなら、結果を投稿してください:)

于 2013-05-22T20:11:42.710 に答える