PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разберете как да структурирате частта за чат на приложението?

Всички модели изглеждат добре. Проблемите са с асоциациите.

Ако дефинирате повече от една асоциация между едни и същи два модела, трябва да посочите различни псевдоними, за да ги различавате един от друг в заявките.

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

Също така е по-добре да дефинирате асоциациите по същия начин или директно след дефинирането на модела, или в статичен метод като associate . Последният подход е за предпочитане, тъй като позволява да се дефинира всеки модел в негов собствен модул без кръстосани препратки, използвайки models параметър в associate метод за достъп до други модели, които трябва да бъдат свързани с даден модел.

Последна забележка:опитайте се да дефинирате асоциации, където модел от лявата страна на дефиниция на асоциация в собствен associate метод. Това означава, че

models.Message.belongsTo(Conversations);

трябва да е в Message модел associate метод:

Message.belongsTo(models.Conversations);

По този начин винаги знаете къде да намерите всички асоциации, които дефинират връзки от определен модел към други модели.

АКТУАЛИЗАЦИЯ

Трябва да съхраните намерен или създаден разговор в променлива, за да го използвате, докато създавате съобщение:

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

Не се опитвайте да смесвате then/catch и await . Ако използвате await вече ще имате резултат или изключение (което можете да обработите с помощта на 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. Настройване на postgres с колба на win7

  2. Как да конвертирате йерархични заявки на oracle в postgresql?

  3. Създаването на тригер за вмъкване на дъщерна таблица връща объркваща грешка

  4. Синтаксисът на Postgresql regexp_matches не работи според очакванията

  5. Създаване на postgresql DB с помощта на psycopg2