PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak ustrukturyzować czat w aplikacji?

Wszystkie modele dobrze się prezentują. Problemy dotyczą skojarzeń.

Jeśli zdefiniujesz więcej niż jedną asocjację między tymi samymi dwoma modelami, powinieneś wskazać różne aliasy, aby odróżnić je od siebie w zapytaniach.

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

Również lepiej jest zdefiniować asocjacje w ten sam sposób, bezpośrednio po definicji modelu lub w metodzie statycznej, takiej jak associate . To drugie podejście jest preferowane, ponieważ pozwala zdefiniować każdy model we własnym module bez żadnych odniesień przy użyciu models parametr w associate metoda dostępu do innych modeli, które powinny być powiązane z danym modelem.

Ostatnia uwaga:spróbuj zdefiniować asocjacje, w których model po lewej stronie definicji asocjacji we własnym associate metoda.Oznacza to, że

models.Message.belongsTo(Conversations);

powinien znajdować się w Message model associate metoda:

Message.belongsTo(models.Conversations);

W ten sposób zawsze wiesz, gdzie znaleźć wszystkie asocjacje, które definiują linki z określonego modelu do innych modeli.

AKTUALIZUJ

Powinieneś zapisać znalezioną lub utworzoną konwersację w zmiennej, aby użyć jej podczas tworzenia wiadomości:

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

Nie próbuj mieszać then/catch i await . Jeśli używasz await masz już wynik lub wyjątek (który możesz obsłużyć za pomocą try/catch ).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.lang.ClassNotFoundException:org.postgresql.Driver, Android

  2. Dobry dostawca OleDB/ODBC dla PostgreSQL

  3. Zwróć tablicę UUID PostgreSQL jako listę z psycopg2

  4. Jak warunkowo grupować w kolumnę bez użycia FULL OUTER JOIN

  5. SQL:Odwróć transponowanie tabeli