#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 Я обновил ответ с формулировкой проблемы и решением.