У меня есть отношения «многие ко многим» для сообщений и тегов.
db.tag.belongsToMany(db.post, {
through: 'post_tags',
foreignKey: 'tagId',
otherKey: 'postId',
})
db.post.belongsToMany(db.tag, {
through: 'post_tags',
foreignKey: 'postId',
otherKey: 'tagId',
})
Я пытаюсь обновить содержимое сообщения, включая связанные с ним теги.
Это начало в строке 7:
exports.update = (req, res) => {
const id = req.params.id
Post.update(req.body, {
where: { id: id },
})
.then((number) => {
if (req.body.tags) {
Tag.findAll({
where: {
name: {
[Op.or]: req.body.tags,
},
},
}).then((tag_items) => {
res.setTags(tag_items)
})
}
if (number == 1) {
res.send({
message: 'This post attempt was successful.',
})
} else {
res.send({
message: `Problem with updating id=${id}. May not exist, or req.body could be empty!`,
})
}
})
.catch((err) => {
res.status(500).send({
message: 'There was an error updating post id=' + id,
})
})
}
Я использую что-то очень похожее для создания поста.
Я надеялся, что это будет работать так, как это работает для этого.
Я прочитал так много документов и поиска в Интернете.
В этот момент я чувствую, что это должно быть что-то простое, что я упускаю из виду.
Может быть, даже опечатка или плохое позиционирование чего-то.
Я попытался создать данные ответа с помощью findByPk в качестве сообщения.
Затем, запустив это с помощью setTags, я все равно получаю ту же ошибку.
Не уверен, может быть, потому что Post.update возвращает разные данные?
Чем делать Post.create, я думал, что читал что-то об этом.
Но я попытался добавить еще один параметр и не получил ожидаемых результатов.
Если вы можете дать какой-либо совет, это было бы очень признательно.
Благодарю вас!
Вы вызвали setTags
в res
, что не является моделью Sequize Post
.
Сначала вам нужно получить экземпляр Post
следующим образом:
Post.findOne({
where: { id: id },
}).then((post) => {
if (req.body.tags) {
Tag.findAll({
where: {
name: {
[Op.or]: req.body.tags,
},
},
}).then((tag_items) => {
post.setTags(tag_items)
})
}
})
И я рекомендую использовать async/await
, чтобы получить код переадресации вместо цепочки then
в этом случае:
exports.update = async (req, res) => {
const id = req.params.id
try {
const number = await Post.update(req.body, {
where: { id: id },
})
if (req.body.tags) {
const post = await Post.findOne({
where: { id: id },
})
const tag_items = await Tag.findAll({
where: {
name: {
[Op.or]: req.body.tags,
},
});
post.setTags(tag_items)
}
if (number == 1) {
res.send({
message: 'This post attempt was successful.',
})
} else {
res.send({
message: `Problem with updating id=${id}. May not exist, or req.body could be empty!`,
})
}
} catch((err) {
res.status(500).send({
message: 'There was an error updating post id=' + id,
})
}
}
Здравствуйте, спасибо, что указали на это. Я должен был заметить, но я думаю, что слишком много ссылался на метод создания, который у меня есть, и запутался в этой части. Async/await также является отличным предложением, и я собираюсь начать работать с ним чаще в будущем. Это фактически решило мои проблемы, и я уверен, что теперь у меня гораздо лучшее понимание некоторых вещей. Я очень ценю помощь, еще раз спасибо!