Как добавить несколько внешних ключей для одной записи в express js с помощью sequelize

#node.js #express #sequelize.js

Вопрос:

У меня есть таблица под названием Stories «есть несколько столбцов и 3 внешних ключа: категория, подкатегория и язык».

Чтобы создать ассоциацию, я добавил функцию sequelize , как показано ниже, которая добавила CategoryId , SubCategoryId и LanguageId столбцы в Story таблицу.

 story.belongsTo(category, { as: 'Category' });
story.belongsTo(subCategory, { as: 'SubCategory' });
story.belongsTo(language, { as: 'Language' });
 

Как я могу добавить историю в таблицу историй?
Ниже приведен мой код.

 const Category = require('../models/category');
const SubCategory = require('../models/subCategory');
const Language = require('../models/language');

exports.postStory = (req, res, next) => {
    const storyTitle = req.body.title;
    const description = req.body.description;    
    const categoryId = req.body.categoryId;
    const subCategoryId = req.body.subCategoryId;
    const languageId = req.body.languageId;


    Category.findOne({
        where: {
            id: categoryId
        }
    }).then(category => {
        return SubCategory.findOne({
            where: {
                id: subCategoryId
            }
        })
    }).then(subcategory => {
        return Language.findOne({
            where: {
                id: languageId
            }
        }).then(language => {
            //save operation here
            const story = new Story({
                story_type: storyType,
                title: storyTitle,
                description: description,
                categoryId: categoryId,
                subCategoryId: subCategoryId,
                languageId: languageId,
                createdBy: 1
            });
            return story.save()
                .then((result) => {
                    res
                        .status(201)
                        .json({
                            message: "Story added to database",
                            statusCode: 201,
                            CreatedBy: 1,
                            result: result,
                        });
                })
        })
    }).catch((error) => {
        if (!error.statusCode) {
            error.statusCode = 500;
        }
        next(error);
    });
 

Хотя он добавляет истории в таблицу историй, но не добавляет идентификатор категории, идентификатор подкатегории и идентификатор языка, он добавляет только нулевые значения для этих полей в соответствии с приведенным ниже снимком экрана.

введите описание изображения здесь

Я не могу понять, как добавить идентификатор категории, идентификатор подкатегории, идентификатор языка в историю.

Ответ №1:

Внешний ключ, который вы используете при создании экземпляра истории, находится внутри camelCase , но вы определили псевдоним внутри PascalCase .

Измените любой псевдоним в определении вашей ассоциации

история.Принадлежит(категория, { как: "категория" });
история.Принадлежит(подкатегория, { как: 'Подкатегория' });
история.Принадлежит(язык, { как: 'язык' });

Или Измените ключ в экземпляре истории

постоянная история = новая история({
 story_type: Тип


истории, заголовок: Заголовок, описание: описание, Категория:
Идентификатор категории
, Подкатегория: Идентификатор
подкатегории, Идентификатор языка: Идентификатор языка, создано: 1
});

Примечание: Добавьте ограничение внешнего ключа для всех ассоциаций, чтобы запретить вставку/обновление нулевого значения.

 story.belongsTo(category, {
  as: "category",
  foreignKey: {
    allowNull: false
  }
});
 

Комментарии:

1. Оба ваших решения не работают для меня.. мой код добавляет записи в базу данных, но он не добавляет идентификатор категории, идентификатор подкатегории и идентификатор языка, он пуст, когда он добавляется в таблицу. ваше первое решение возвращает тот же результат, а второе решение попадает в последний блок else // отправить ответ об ошибке, так как все запросы promise не выполнили ни категорию, ни подкатегорию, ни языковой запрос не выполняется

2. Я добавил снимок экрана, о котором идет речь, не могли бы вы, пожалуйста, взглянуть?

3. @PrasadGavande вы проверили, какой из 3 запросов вызвал проблему.

4. он не показывает никаких ошибок, я также получаю идентификаторы , но когда я пытаюсь добавить его в Story.save(), он не добавляется.. Это правильный способ добавления ? Потому что, когда у нас есть связь с sequalize, она будет добавлена как метод Category.addStory (), если она связана с одной таблицей.

5. @PrasadGavande Я обновил ответ с формулировкой проблемы и решением.