首页 > 解决方案 > 尝试在 node.js 应用程序的猫鼬模式中向 mongoDb 添加消息历史记录

问题描述

我正在尝试使用带有 express 作为后端的 node.js 和 sockets 构建一个基本的聊天应用程序。现在,我正在根据客户端 ID 和其他所有内容将客户端发送的消息保存在他们的数据库中。为此,我使用构造函数设置了一个名为 PrivateMessage 的类,该构造函数最终将成为 Mongo Schema 中保存的消息结构所遵循的模型。然后在我的 mongo Schema 上,我为用户设置了一个名为 messages 的项目,这将是一个与 PrivateMessage 类具有相同结构的对象数组(我没有使用 typesript)。

CLASS PRIVATE MESSAGE IN NODEJS
class MessagePrivate {
  constructor(userIdTo, userIdSender, userIdName, message) {
    this.userIdTo = userIdTo;
    this.userIdSender = userIdSender;
    this.userIdName = userIdName;
    this.message = message;
  }
} 
SCHEMA USER WITH MESSAGES ITEMS

const { Schema, model } = require("mongoose");
const { MessagePrivate } = require("../models/chat-model");
const messagePrivate = new MessagePrivate();

const userSchema = new Schema({
  
  ...OTHER ITEMS...
 
  messages: [{userIdTo:String, userIdSender:String, userIdName:String, message:String}], <===HERE
  userState: { type: Boolean, default: true },
  friends: [{ type: String, required: false }],
 
});


userSchema.plugin(uniqueValidator, { message: "the {PATH} must e unique" });

userSchema.method("toJSON", function () {
  const { __v, _id, password, ...object } = this.toObject();
  object.id = _id;
  return object;
})
module.exports = model("User", userSchema);


然后在任何时候激活标志时触发我的套接字(在这种情况下,私人消息的标志我的意思是通过用户的模式将该消息保存在数据库中,推送该消息结构。但找不到方法


//=============================================================
//Socket de Io
//=================================================================
const { Socket } = require("socket.io");

const User = require("../models/user-model");


const { ChatMessage, Message,MessagePrivate } = require("../models/chat-model");

const chatMessage = new ChatMessage();

const socketController = async (socket = new Socket(), io) => {
  

  const user = await jwtValidatorRenew(
    socket.handshake.headers["token-response"]//getting user decoded
  );
  
  try {
    // socket.on('connection',async()=>{
    if (!user || user == undefined) {
      console.log("user disconnected");
      return socket.disconnect();
    }
    
    chatMessage.addUserToChat(user);
    
    io.emit("active-users", chatMessage.usersConnected);
    
    socket.join(user.id);
    
    socket.on("disconnect", () => {
      console.log("Client DisconectedConected", socket.id); // desconexion
      chatMessage.disconnectUserFromChat(user.id);
      io.emit("active-users", chatMessage.usersConnected);
    });
    

    socket.on("sendMessage", (payload,res) => {
      console.log(payload);
      if (payload) {
        if (payload.userId) {
        
          const messagePrivatSaved=new MessagePrivate(payload.userId,user.id,user.name,payload.message)
         
          let userSenderToSaveMsg=User.findByIdAndUpdate(user.id,{messages:"algo"},{new:true})

          let userRecToSaveMsg=User.findByIdAndUpdate(payload.userId,{messages:messages.push(new MessagePrivate(payload.userId,user.id,user.name,payload.message))},{new:true})

          //Here trying to save for database the message both for sender and receiver(doesn't work)


          chatMessage.sendPrivateMessage(payload.userId,user.id,user.name,payload.message);

          socket.to(payload.userId).emit(
            "privateMessage",
                        chatMessage.last10Messages,
          );
        } else {
          chatMessage.sendMessage(user.id, user.name, payload.message);
          io.emit("receiveMessage", chatMessage.last10Messages);
        }
      }
    });

    socket.on("all-users", () => {
      console.log("user changed");
      io.emit("active-users", chatMessage.usersConnected);
    });
  } catch (error) {
    socket.disconnect();
  }
};



module.exports = { socketController };


我不确定我在做什么是正确的。因此,将不胜感激任何帮助。提前致谢

标签: javascriptnode.jsdatabasemongodbmongoose-schema

解决方案


推荐阅读