sql >> Databasteknik >  >> RDS >> PostgreSQL

Följ hur man strukturerar chattdelen av appen?

Alla modeller ser bra ut. Problemen ligger hos föreningar.

Om du definierar mer än en association mellan samma två modeller bör du ange olika alias för att skilja dem från varandra i frågor.

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

Det är också bättre att definiera associationer på samma sätt antingen direkt efter modelldefinitionen eller i en statisk metod som associate . Det senare tillvägagångssättet är att föredra eftersom det gör det möjligt att definiera varje modell i sin egen modul utan några korsreferenser med models parameter i associate metod för att komma åt andra modeller som bör associeras med en given modell.

Sista anteckning:försök att definiera associationer där en modell på vänster sida av en associationsdefinition i sin egen associate metod.Det betyder att

models.Message.belongsTo(Conversations);

ska finnas i Message modell associate metod:

Message.belongsTo(models.Conversations);

På så sätt vet du alltid var du hittar alla associationer som definierar länkar från en viss modell till andra modeller.

UPPDATERA

Du bör lagra en hittad eller skapad konversation i en variabel för att kunna använda den när du skapar ett meddelande:

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

Försök inte blanda ihop then/catch och await . Om du använder await du kommer redan att ha ett resultat eller ett undantag (som du kan hantera med try/catch ).




  1. Oracle Table Function från CTE

  2. Sammansättning av stacken - Förenkla Docker-distributionen av MySQL-behållare

  3. Hitta datum mellan startdatum och slutdatum

  4. sql-fråga för att få raderade poster