Всички модели изглеждат добре. Проблемите са с асоциациите.
Ако дефинирате повече от една асоциация между едни и същи два модела, трябва да посочите различни псевдоними, за да ги различавате един от друг в заявките.
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'
});
Също така е по-добре да дефинирате асоциациите по същия начин или директно след дефинирането на модела, или в статичен метод като associate
. Последният подход е за предпочитане, тъй като позволява да се дефинира всеки модел в негов собствен модул без кръстосани препратки, използвайки models
параметър в associate
метод за достъп до други модели, които трябва да бъдат свързани с даден модел.
Последна забележка:опитайте се да дефинирате асоциации, където модел от лявата страна на дефиниция на асоциация в собствен associate
метод. Това означава, че
models.Message.belongsTo(Conversations);
трябва да е в Message
модел associate
метод:
Message.belongsTo(models.Conversations);
По този начин винаги знаете къде да намерите всички асоциации, които дефинират връзки от определен модел към други модели.
АКТУАЛИЗАЦИЯ
Трябва да съхраните намерен или създаден разговор в променлива, за да го използвате, докато създавате съобщение:
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",
});
Не се опитвайте да смесвате then/catch
и await
. Ако използвате await
вече ще имате резултат или изключение (което можете да обработите с помощта на try/catch
).