Alle modellen zien er goed uit. De problemen zijn met verenigingen.
Als u meer dan één associatie tussen dezelfde twee modellen definieert, moet u verschillende aliassen aangeven om ze van elkaar te onderscheiden in zoekopdrachten.
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'
});
Het is ook beter om associaties op dezelfde manier te definiëren, ofwel direct na de modeldefinitie of in een statische methode zoals associate
. De laatste benadering verdient de voorkeur omdat het het mogelijk maakt om elk model in zijn eigen module te definiëren zonder kruisverwijzingen met behulp van de models
parameter in associate
methode om toegang te krijgen tot andere modellen die aan een bepaald model moeten worden gekoppeld.
Laatste opmerking:probeer associaties te definiëren waarbij een model aan de linkerkant van een associatiedefinitie in zijn eigen associate
methode.Het betekent dat
models.Message.belongsTo(Conversations);
zou in Message
moeten staan model associate
methode:
Message.belongsTo(models.Conversations);
Zo weet je altijd waar je alle associaties kunt vinden die links van een bepaald model naar andere modellen definiëren.
UPDATE
Je moet een gevonden of een gemaakt gesprek opslaan in een variabele om het te gebruiken tijdens het maken van een bericht:
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",
});
Probeer then/catch
niet door elkaar te halen en await
. Als u await
gebruikt je hebt al een resultaat of een uitzondering (die je kunt afhandelen met try/catch
).