API для вставки данных в массив объектов в mongoDB - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь вставить массив объектов в массив объектов в моей схеме mongoDB. Вот как я хочу, чтобы моя схема отображалась.

const CourseSchema = mongoose.Schema({
    categoryname: {
        type: String,
        required: "Course Category",
        min: 3,
        max: 100
    },
    coursename: {
        type: String,
        required: "Course Name",
        min: 3,
        max: 100
    },
    levels:
        [
            {
                levelid: Number,
                levelname: String,
                chapter:
                    [
                        {
                            chapternumber: Number,
                            chaptername: String,
                            content: String  //To be elaborated
                        }
                    ]
            }
        ]
});

Мой API, который я написал, выглядит следующим образом:

exports.addcourse = (req, res) => {
    let levels = [];
    levels.push({
        levelid: req.body.levelid,
        levelname: req.body.levelname,
        chapter: [
            {
                chapternumber: req.body.chapternumber,
                chaptername: req.body.chaptername,
                content: req.body.content
            }
        ]
    })
    const newCourse = new Course({
        coursename: req.body.coursename,
        categoryname: req.body.categoryname,
        levels: levels
    });
    newCourse.save(function (error) {
        if (error) res.json({ message: 'could not add course because ' + error });
        res.json({ newCourse: newCourse });
    });
}

Это прекрасно работает, когда я вхожу на один уровень и одну главу, но выдает ошибку при вводе нескольких данных. Я предоставляю информацию от почтальона 'x- www'form-urlencoded'.

, пожалуйста, помогите.

Ошибка, которую я получаю, когда добавляю еще один levelid и levelname в почтальоне

{
    "message": "could not add course because ValidationError: levels.0.levelid: Cast to Number failed for value \"[ '1', '2' ]\" at path \"levelid\", levels.0.levelname: Cast to String failed for value \"[ 'First Level', 'Second Level' ]\" at path \"levelname\""
}

Данные, которые я пытаюсь ввести The data i am trying to enter[1]

1 Ответ

2 голосов
/ 27 февраля 2020

В почтальоне, когда вы посылаете один и тот же ключ levelid дважды, он преобразует его в массив, содержащий оба значения. Как и в вашем случае, в req.body.levelid вы получите [1, 2]. Но в вашей схеме levelid ожидает числовое значение. Кроме того, вы неправильно читаете это в своем коде API. Вместо отдельного получения levelid и chapter вы можете получить массив level в теле запроса со значениями levelid , levelname и глава . Точно так же, chapter может быть массивом объектов. req.body.levels будет выглядеть так:

[{
  levelid: 1,
  levelname: "level1",
  chapter: [{
              chapternumber: 1,
              chaptername: "chapter1",
              content: "chapter1-content"
           }, {
              chapternumber: 2,
              chaptername: "chapter2",
              content: "chapter2-content"
           }] 
}]

Попробуйте это в почтальоне, введя raw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...