Пн goose: невозможно добавить один элемент в массив Пн goose SchemaType. Хотя можно добавить более одного - PullRequest
0 голосов
/ 06 апреля 2020

Ниже моя схема

var makerSchema = new mongoose.Schema({
    materials:[
        {
            type: String,
            required:[true, "Material is a required field"],
            trim:true,
            lowercase:true,
            enum:{
                values:['wood','metal','plastic','glass','concrete','other'], 
                message: 'Please choose from the given options only!'
            }
        }
    ]
},{
    timestamps:true
})

var Maker = mongoose.model('Maker', makerSchema);

Ниже мой маршрут

router.post('/maker', async (req, res) => {
    try {
        var maker = new Maker(req.body);
        await maker.save();
        res.status(200).send();
    } catch (error) {
        if (error.name === "ValidationError") {
            let errors = {};

            Object.keys(error.errors).forEach((key) => {
              errors[key] = error.errors[key].message;
            });

            return res.status(400).send(errors);
          }
          res.status(500).send(error);
    }
})

Ниже моя форма, в которой я могу выбрать несколько элементов, удерживая Ctrl и щелкая опции.

<form action="/maker" method="POST">
    <select multiple class="form-control" id="materials" name="materials">
       <option>Wood</option>
       <option>Metal</option>
       <option>Glass</option>
    </select>
   <input type="submit" value="Submit">
</form>

Но если я выберу одну опцию, я получаю следующую ошибку, хотя она отлично работает для нескольких опций:

{"materials.0":"Please choose from the given options only!"}

Как мне разрешить эту ошибку и позволить пользователям выбирать не только несколько, но и несколько одиночные варианты тоже?

1 Ответ

1 голос
/ 06 апреля 2020

Я предполагаю, что при выборе ОДНОГО материала вы получите «неправильный» тип данных для maker.materials, a String.
При выборе нескольких материалов вы получите Array<String> в вашем маршрутизаторе.

Таким образом, я бы проверил тип данных materials в маршрутизаторе перед сохранением Maker. И преобразовать его в Array, если он уже не один.

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