Všechny modely vypadají dobře. Problémy jsou s asociacemi.
Pokud definujete více než jednu asociaci mezi stejnými dvěma modely, měli byste uvést různé aliasy, abyste je od sebe v dotazech odlišili.
User.hasMany(Messages, {
foreignKey: 'senderId',
as: 'OutgoingMessages'
});
User.hasMany(Messages, {
foreignKey: 'receiverId',
as: 'IncomingMessages'
});
Messages.belongsTo(models.User, {
foreignKey: "senderId",
as: 'Sender'
});
Messages.belongsTo(models.User, {
foreignKey: "receiverId",
as: 'Receiver'
});
Také je lepší definovat asociace stejným způsobem buď přímo po definici modelu, nebo statickou metodou jako associate
. Druhý přístup je výhodnější, protože umožňuje definovat každý model v jeho vlastním modulu bez jakýchkoli křížových odkazů pomocí models
parametr v associate
metoda pro přístup k dalším modelům, které by měly být přidruženy k danému modelu.
Poslední poznámka:zkuste definovat přidružení, kde model na levé straně definice přidružení ve svém vlastním associate
metoda.To znamená, že
models.Message.belongsTo(Conversations);
by měl být v Message
associate
modelu metoda:
Message.belongsTo(models.Conversations);
Tímto způsobem vždy víte, kde najdete všechna přidružení, která definují odkazy z určitého modelu na jiné modely.
AKTUALIZACE
Nalezenou nebo vytvořenou konverzaci byste měli uložit do proměnné, abyste ji mohli použít při vytváření zprávy:
let conversation = await Conversations.findOne({
where:{
user1:{[Op.or]:[req.user.id,post.userId]},
user2:{[Op.or]:[req.user.id,post.userId]},
PostId:req.body.postId,
}
})
if (!conversation){
conversation = await Conversations.create({
user1: req.user.id,
user2: post.userId,
PostId:req.body.postId,
})
}
const newMessage = await Messages.create({
senderId: req.user.id,
receiverId: post.userId,
message: req.body.message,
conversationId:conversation.id
})
res.status(201).send({
msg: "upload successful",
});
Nesnažte se zaměňovat then/catch
a await
. Pokud použijete await
již budete mít výsledek nebo výjimku (kterou můžete zpracovat pomocí try/catch
).