Wszystkie modele dobrze się prezentują. Problemy dotyczą skojarzeń.
Jeśli zdefiniujesz więcej niż jedną asocjację między tymi samymi dwoma modelami, powinieneś wskazać różne aliasy, aby odróżnić je od siebie w zapytaniach.
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'
});
Również lepiej jest zdefiniować asocjacje w ten sam sposób, bezpośrednio po definicji modelu lub w metodzie statycznej, takiej jak associate
. To drugie podejście jest preferowane, ponieważ pozwala zdefiniować każdy model we własnym module bez żadnych odniesień przy użyciu models
parametr w associate
metoda dostępu do innych modeli, które powinny być powiązane z danym modelem.
Ostatnia uwaga:spróbuj zdefiniować asocjacje, w których model po lewej stronie definicji asocjacji we własnym associate
metoda.Oznacza to, że
models.Message.belongsTo(Conversations);
powinien znajdować się w Message
model associate
metoda:
Message.belongsTo(models.Conversations);
W ten sposób zawsze wiesz, gdzie znaleźć wszystkie asocjacje, które definiują linki z określonego modelu do innych modeli.
AKTUALIZUJ
Powinieneś zapisać znalezioną lub utworzoną konwersację w zmiennej, aby użyć jej podczas tworzenia wiadomości:
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",
});
Nie próbuj mieszać then/catch
i await
. Jeśli używasz await
masz już wynik lub wyjątek (który możesz obsłużyć za pomocą try/catch
).