PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Sequelize comment structurer la partie chat de l'appli ?

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