Alla modeller ser bra ut. Problemen ligger hos föreningar.
Om du definierar mer än en association mellan samma två modeller bör du ange olika alias för att skilja dem från varandra i frågor.
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'
});
Det är också bättre att definiera associationer på samma sätt antingen direkt efter modelldefinitionen eller i en statisk metod som associate
. Det senare tillvägagångssättet är att föredra eftersom det gör det möjligt att definiera varje modell i sin egen modul utan några korsreferenser med models
parameter i associate
metod för att komma åt andra modeller som bör associeras med en given modell.
Sista anteckning:försök att definiera associationer där en modell på vänster sida av en associationsdefinition i sin egen associate
metod.Det betyder att
models.Message.belongsTo(Conversations);
ska finnas i Message
modell associate
metod:
Message.belongsTo(models.Conversations);
På så sätt vet du alltid var du hittar alla associationer som definierar länkar från en viss modell till andra modeller.
UPPDATERA
Du bör lagra en hittad eller skapad konversation i en variabel för att kunna använda den när du skapar ett meddelande:
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",
});
Försök inte blanda ihop then/catch
och await
. Om du använder await
du kommer redan att ha ett resultat eller ett undantag (som du kan hantera med try/catch
).