Tutti i modelli stanno bene. I problemi sono con le associazioni.
Se definisci più di un'associazione tra gli stessi due modelli, dovresti indicare alias diversi per distinguerli l'uno dall'altro nelle query.
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'
});
Inoltre è meglio definire le associazioni nello stesso modo o direttamente dopo la definizione del modello o in un metodo statico come associate
. Quest'ultimo approccio è preferibile perché permette di definire ogni modello nel proprio modulo senza alcun riferimento incrociato utilizzando i models
parametro in associate
metodo per accedere ad altri modelli che dovrebbero essere associati a un determinato modello.
Ultima nota:prova a definire associazioni in cui un modello sul lato sinistro di un'associazione definisce nel proprio associate
metodo. Significa che
models.Message.belongsTo(Conversations);
dovrebbe essere in Message
modello associate
metodo:
Message.belongsTo(models.Conversations);
In questo modo sai sempre dove trovare tutte le associazioni che definiscono i collegamenti da un determinato modello ad altri modelli.
AGGIORNAMENTO
Dovresti memorizzare una conversazione trovata o creata in una variabile per poterla utilizzare durante la creazione di un messaggio:
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",
});
Non cercare di confondere then/catch
e await
. Se usi await
avrai già un risultato o un'eccezione (che puoi gestire usando try/catch
).