Массив объектов в мангусте

Я пытаюсь сохранить массив объектов внутри mongodb с помощью mongoose и node, с простой проверкой и очень трудно с этим

Я определяю схему и настраиваемую функцию проверки следующим образом:

const mongoose = require("mongoose");
const fieldsSchema = mongoose.Schema({
  title: {
    type: String,
    minlength: 2,
    maxlength: 250,
  },
  list: {
    type: Array,
    primaryText: {
      type: String,
      minlength: 1,
      maxlength: 250,
    },
    secondaryText: {
      type: String,
      minlength: 2,
      maxlength: 250,
    },
    listType: {
      type: String,
      enum: ["listOne", "listTwo"],
      minlength: 2,
      maxlength: 250,
    },
    items: {
      required: isListTypeTwo,
      type: Array,
      itemTitle: {
        type: String,
        minlength: 2,
        maxlength: 250,
      },
      itemContent: {
        type: String,
        minlength: 2,
        maxlength: 250,
      },
    },
  },
});

function isListTypeTwo() {
  if (this.listType === "listTwo") return true;
  return false;
}

const Field = new mongoose.model("Field", fieldsSchema);

exports.fieldsSchema = fieldsSchema;
exports.Field = Field;

А затем я создаю такой почтовый маршрут:

const { Field } = require("../models/field");

const express = require("express");
const router = express.Router();

router.post("/", async (req, res, next) => {
  let field = new Field({
    title: req.body.title,
    list: req.body.list,
  });
  field = await field.save();
  res.send(field);
});

module.exports = router;

Я передаю свои данные JSON почтальону вот так:

{
    "title": "title",
    "list": [
        {
            "primaryText": "primaryText",
            "secondaryText": "secondaryText",
            "listType": "listOne"
        },
        {
            "primaryText": "primaryText",
            "secondaryText": "secondaryText",
            "listType": "listTwo"
        }
    ]
}

Вот несколько вопросов, которые я не могу решить и прошу вашей помощи:

  1. Как я могу передать в свой маршрут правильно определенную структуру массива, так сказать, вместо: list: req.body.list, что-то более подробное (но, конечно, без доступа к каждому объекту вручную, например, ~ [0], ~ [1] и т. Д.) ?

  2. Почему моя проверка не работает?

  3. Возможно, мне следует передать JSON каким-либо другим способом / структурой?


person gerenef    schedule 02.02.2021    source источник
comment
В чем ошибка проверки вашей схемы?   -  person Jérôme    schedule 02.02.2021
comment
Ошибки нет, он просто идет и ест все, что я его кормлю в req.body.list   -  person gerenef    schedule 02.02.2021
comment
Даже если я просто удалю там ссылку на функцию (проверка) и просто добавлю true, она все равно пройдет без каких-либо сообщений об ошибках. Я думаю, это связано с тем, как передается req.body.list, но я не уверен   -  person gerenef    schedule 02.02.2021


Ответы (1)


Прежде всего, вам понадобится промежуточное ПО body-parser для правильного анализа JSON.

const express = require("express");
const bodyParser = require("body-parser");
const app = express(); // no need to call Router()

// parse application/json
app.use(bodyParser.json())

app.post("/", async (req, res) => {
  // your stuff...
});

Как я могу передать правильно определенную структуру массива в свой маршрут, так сказать, вместо: list: req.body.list, что-то более подробное (но, конечно, без доступа к каждому объекту вручную, например, ~ [0], ~ 1 и т. д.)?

Не уверен, правильно ли я понял, но, может быть, вам нужен только цикл для сохранения ваших полей?

  const promises = req.body.list.map(async (item) => { // map loop which will return array of promises
    const field = new Field({
      title: req.body.title,
      item,
    });
    return field.save(); // returning the promise
  });

  res.send(Promise.all(promises));

Кроме того, добавьте блок try / catch, чтобы отловить и зарегистрировать любую возможную ошибку в вашей схеме мангуста:

try {
  const field = new Field({
    title: req.body.title,
    item,
  });
  field.save();
  // success
} catch (error) {
  console.error(error);
}
person Jérôme    schedule 02.02.2021