PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie strukturiert man den Chat-Teil der App?

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