sql >> Database >  >> RDS >> PostgreSQL

Sequelize hoe het chatgedeelte van de app te structureren?

Alle modellen zien er goed uit. De problemen zijn met verenigingen.

Als u meer dan één associatie tussen dezelfde twee modellen definieert, moet u verschillende aliassen aangeven om ze van elkaar te onderscheiden in zoekopdrachten.

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

Het is ook beter om associaties op dezelfde manier te definiëren, ofwel direct na de modeldefinitie of in een statische methode zoals associate . De laatste benadering verdient de voorkeur omdat het het mogelijk maakt om elk model in zijn eigen module te definiëren zonder kruisverwijzingen met behulp van de models parameter in associate methode om toegang te krijgen tot andere modellen die aan een bepaald model moeten worden gekoppeld.

Laatste opmerking:probeer associaties te definiëren waarbij een model aan de linkerkant van een associatiedefinitie in zijn eigen associate methode.Het betekent dat

models.Message.belongsTo(Conversations);

zou in Message moeten staan model associate methode:

Message.belongsTo(models.Conversations);

Zo weet je altijd waar je alle associaties kunt vinden die links van een bepaald model naar andere modellen definiëren.

UPDATE

Je moet een gevonden of een gemaakt gesprek opslaan in een variabele om het te gebruiken tijdens het maken van een bericht:

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

Probeer then/catch niet door elkaar te halen en await . Als u await gebruikt je hebt al een resultaat of een uitzondering (die je kunt afhandelen met try/catch ).




  1. verwijzen naar kolommen voor automatisch ophogen?

  2. Afbeeldingen opslaan in een mysql-database

  3. Column Not Allowed-fout bij het invoegen van rijen met behulp van reekswaarden

  4. SQL-overeenkomst op letter- en cijferrangschikking zonder gebruik te maken van reguliere expressies