PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sequelizzare come strutturare la parte chat dell'app?

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 ).