Tous les modèles ont l'air bien. Les problèmes sont avec les associations.
Si vous définissez plusieurs associations entre les deux mêmes modèles, vous devez indiquer des alias différents pour les distinguer les uns des autres dans les requêtes.
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'
});
Il est également préférable de définir les associations de la même manière soit directement après la définition du modèle, soit dans une méthode statique telle que associate
. Cette dernière approche est préférable car elle permet de définir chaque modèle dans son propre module sans aucun renvoi en utilisant les models
paramètre dans associate
méthode pour accéder à d'autres modèles qui devraient être associés à un modèle donné.
Dernière note :essayez de définir des associations où un modèle sur le côté gauche d'une définition d'association dans son propre associate
méthode. Cela signifie que
models.Message.belongsTo(Conversations);
devrait être dans Message
modèle associate
méthode :
Message.belongsTo(models.Conversations);
De cette façon, vous savez toujours où trouver toutes les associations qui définissent les liens d'un certain modèle vers d'autres modèles.
MISE À JOUR
Vous devez stocker une conversation trouvée ou créée dans une variable afin de l'utiliser lors de la création d'un message :
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",
});
N'essayez pas de confondre then/catch
et await
. Si vous utilisez await
vous aurez déjà un résultat ou une exception (que vous pouvez gérer en utilisant try/catch
).