sql >> Base de Datos >  >> RDS >> PostgreSQL

Secuela de cómo estructurar la parte de chat de la aplicación?

Todos los modelos se ven bien. Los problemas son con las asociaciones.

Si define más de una asociación entre los mismos dos modelos, debe indicar diferentes alias para distinguirlos en las consultas.

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'
});

También es mejor definir asociaciones de la misma manera, ya sea directamente después de la definición del modelo o en un método estático como associate . El último enfoque es preferible porque permite definir cada modelo en su propio módulo sin referencias cruzadas utilizando los models parámetro en associate método para acceder a otros modelos que deberían estar asociados con un modelo dado.

Última nota:intente definir asociaciones donde un modelo en el lado izquierdo de una definición de asociación en su propio associate método. Significa que

models.Message.belongsTo(Conversations);

debe estar en Message modelo associate método:

Message.belongsTo(models.Conversations);

De esa forma, siempre sabrá dónde encontrar todas las asociaciones que definen enlaces de un determinado modelo a otros modelos.

ACTUALIZAR

Debe almacenar una conversación encontrada o creada en una variable para usarla mientras crea un mensaje:

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",
});

No intentes mezclar then/catch y await . Si usa await ya tendrá un resultado o una excepción (que puede manejar usando try/catch ).