Как сохранить несколько категорий для одного поста с помощью Mongoose - PullRequest
0 голосов
/ 30 января 2020

Итак, у меня есть 2 схемы: игра и категория:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const gameSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    category: [{
        type: Schema.Types.ObjectId,
        ref: 'category'
    }],

});

module.exports = { Game: mongoose.model('game', gameSchema) };
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const categorySchema = new Schema({
    title: {
        type: String,
        required: true
    },
});

module.exports = { Category: mongoose.model('category', categorySchema) };

Я пытаюсь сохранить новую игру, которая содержит несколько категорий:

const newGame = new Game({
            title: req.body.title,
            description: req.body.postDescription,
            category: req.body.category,
        });

        newGame.save().then((game, err) => {
            if (err) {
                console.log(err)
            } else {
                req.flash('success-message', 'New Game Created');
                res.redirect('/admin/games');
            }
        });

И вот мой внешний код (руль). Я использую плагин ввода тегов для jquery, чтобы получить массив категорий

<label for="category">Category</label>
<select multiple name="category" id="category" class="cat form-control">
       {{#select game.category}}
       {{#each categories}}
       <option value="{{title}}">{{title}}</option>
       {{/each}}
       {{/select}}
</select>

Ошибка:

 UnhandledPromiseRejectionWarning: ValidationError: game validation failed: category: Cast to Array failed for value "[ 'ACTION','MOBILE','RPG' ]" at path "category"

Мне нужна помощь в понимании причины возникновения этой ошибки, спасибо вы.

1 Ответ

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

?‍? Вы можете попробовать этот код ниже ?, чтобы сохранить свою игру и свою категорию.

const jobQuerys = [];

const { category: categories, title, postDescription: description } = req.body;

// save category
categories.forEach(title => {
  const category = new Category({ title })
  jobQuerys.push(category.save());
});

// get all category was saved
const categoriesResult = await Promise.all(jobQuerys);

// category id temporary
const arrCategoryId = [];

// add category._id to arrCategoryId
categoriesResult.forEach(category => {
  arrCategoryId.push(category._id);
});

// save game with categoryId
const game = new Game({ title, description, category: arrCategoryId });
const result = await game.save();

// show result
console.log(result);

? Убедитесь, что мы используем await в этом коде, поэтому в вашей функции, пожалуйста, добавьте async.

Я надеюсь, что это может помочь вам ?.

...