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