Сохранить массив поддокументов, используя схему Mon goose - PullRequest
0 голосов
/ 29 января 2020

Однако мне нужно сохранить массив поддокументов (категорий) для каждого элемента. Проблема связана с обработкой массива, переданного в запросе.

Основная проблема, с которой я столкнулся, заключается в том, как успешно сохранить массив категорий в элементе.

У меня есть две модели в MongoDB, а именно :

  • Элемент

  • Категория

Схема элемента:

const Item = mongoose.model(
  'Items',
  new mongoose.Schema({
    name: {
      type: String,
      required: true,
      trim: true,
      minlength: 2,
      maxlength: 255
    },
    category: [categorySchema],
    numInStock: {
      type: Number,
      required: true,
      min: 0,
      max: 255
    },
    unitPrice: {
      type: Number,
      required: true,
      min: 0,
      max: 255
    }
  })
);

Схема категории:

const categorySchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 2,
    maxlength: 50
  },
  user_id: {
    type: ObjectId,
    required: false
  }
});

То, что у меня есть для маршрута Express для POST к элементам:

router.post('/', [auth], async (req, res) => {
  const { error } = validate(req.body);
  if (error) return res.status(400).send({ data: error.details[0].message });

  const category = await Category.findById(req.body.categoryId);
  if (!category) return res.status(400).send({ data: 'Invalid category.' });

  console.log('LOG: categoryIds: ', req.body.categoryId[0]);

  const item = new Item({
    name: req.body.name,
    category: [
      {
        _id: req.body.categoryId._id,
        name: req.body.categoryId.name
      }
    ],
    numInStock: req.body.numInStock,
    unitPrice: req.body.unitPrice,
    publishDate: moment().toJSON()
  });
  await item.save();

  res.send({ data: item });
});

Тело POST выглядит так:

{
    "name": "AnotherNew item",
    "categoryId": [{"name": "Vegetables", "_id": "5de43de8805f4fac35f691c0"},{"name": "Seafood", "_id": "5de43de8805f4fac35f691c4"}],
    "numInStock": 0,
    "unitPrice": 0
}

Полученная ошибка:

error: Items validation failed: category.0.name: Path `name` is required. message=Items validation failed: category.0.name: Path `name` is required., message=Path `name` is required., name=ValidatorError, validator=function(v) {
    const cachedRequired = get(this, '$__.cachedRequired');

    // no validation when this path wasn't selected in the query.
    if (cachedRequired != null && !this.isSelected(_this.path) && !this.isModified(_this.path)) {
      return true;
    }

    // `$cachedRequired` gets set in `_evaluateRequiredFunctions()` so we
    // don't call required functions multiple times in one validate call
    // See gh-6801
    if (cachedRequired != null && _this.path in cachedRequired) {
      const res = cachedRequired[_this.path] ?
        _this.checkRequired(v, this) :
        true;
      delete cachedRequired[_this.path];
      return res;
    } else if (typeof required === 'function') {
      return required.apply(this) ? _this.checkRequired(v, this) : true;
    }

    return _this.checkRequired(v, this);
  }, message=Path `name` is required., type=required, path=name, value=undefined, kind=required, path=name, value=undefined, reason=undefined, _message=Items validation failed, stack=ValidationError: Items validation failed: category.0.name: Path `name` is required

1 Ответ

0 голосов
/ 30 января 2020

Я решил эту проблему, передав массив req.body.categoryId из запроса в category в новом экземпляре Item.

Я благодарен за любые отзывы о моих изменениях.

Мои изменения в маршруте POST элемента следующие:

router.post('/', [auth], async (req, res) => {
  const { error } = validate(req.body);
  if (error) return res.status(400).send({ data: error.details[0].message });

  const category = await Category.findById(req.body.categoryId);
  if (!category) return res.status(400).send({ data: 'Invalid category.' });

  console.log('LOG: categoryIds: ', req.body.categoryId);

  const item = new Item({
    name: req.body.name,
    category: req.body.categoryId,
    numInStock: req.body.numInStock,
    unitPrice: req.body.unitPrice,
    publishDate: moment().toJSON()
  });
  await item.save();

  res.send({ data: item });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...