Tất cả các mô hình trông tốt. Vấn đề là với các liên kết.
Nếu bạn xác định nhiều hơn thì một liên kết giữa hai mô hình giống nhau, bạn nên chỉ ra các bí danh khác nhau để phân biệt chúng với nhau trong các truy vấn.
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'
});
Ngoài ra, tốt hơn nên xác định các liên kết theo cùng một cách hoặc trực tiếp sau định nghĩa mô hình hoặc trong một phương thức tĩnh như associate
. Cách tiếp cận thứ hai thích hợp hơn vì nó cho phép xác định từng mô hình trong mô-đun riêng của nó mà không có bất kỳ tham chiếu chéo nào bằng cách sử dụng models
tham số trong associate
để truy cập các mô hình khác nên được liên kết với một mô hình nhất định.
Lưu ý cuối cùng:cố gắng xác định các liên kết trong đó một mô hình ở phía bên trái của định nghĩa liên kết trong associate
của chính nó phương pháp. Nó có nghĩa là
models.Message.belongsTo(Conversations);
phải ở trong Message
mô hình associate
phương pháp:
Message.belongsTo(models.Conversations);
Bằng cách đó, bạn luôn biết nơi để tìm tất cả các liên kết xác định các liên kết từ một mô hình nhất định đến các mô hình khác.
CẬP NHẬT
Bạn nên lưu trữ một cuộc hội thoại đã tìm thấy hoặc đã tạo vào một biến để sử dụng nó trong khi tạo thông báo:
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",
});
Đừng cố trộn lẫn then/catch
và await
. Nếu bạn sử dụng await
bạn sẽ có một kết quả hoặc một ngoại lệ (bạn có thể xử lý bằng cách sử dụng try/catch
).