Alle Modelle sehen gut aus. Die Probleme liegen bei Verbänden.
Wenn Sie mehr als eine Assoziation zwischen den gleichen zwei Modellen definieren, sollten Sie verschiedene Aliase angeben, um sie in Abfragen voneinander zu unterscheiden.
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'
});
Außerdem ist es besser, Assoziationen auf die gleiche Weise zu definieren, entweder direkt nach der Modelldefinition oder in einer statischen Methode wie associate
. Der letztere Ansatz ist vorzuziehen, da er es ermöglicht, jedes Modell in einem eigenen Modul ohne Querverweise mithilfe der models
zu definieren Parameter in associate
-Methode, um auf andere Modelle zuzugreifen, die mit einem bestimmten Modell verknüpft werden sollen.
Letzte Anmerkung:Versuchen Sie, Assoziationen zu definieren, bei denen ein Modell auf der linken Seite einer Assoziationsdefinition in seinem eigenen associate
ist Methode. Es bedeutet, dass
models.Message.belongsTo(Conversations);
sollte in Message
stehen Modell associate
Methode:
Message.belongsTo(models.Conversations);
Auf diese Weise wissen Sie immer, wo Sie alle Assoziationen finden können, die Verknüpfungen von einem bestimmten Modell zu anderen Modellen definieren.
AKTUALISIEREN
Sie sollten eine gefundene oder erstellte Konversation in einer Variablen speichern, um sie beim Erstellen einer Nachricht zu verwenden:
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",
});
Versuchen Sie nicht, then/catch
zu verwechseln und await
. Wenn Sie await
verwenden Sie haben bereits ein Ergebnis oder eine Ausnahme (die Sie mit try/catch
behandeln können ).