javascript - 尝试在 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 };
我不确定我在做什么是正确的。因此,将不胜感激任何帮助。提前致谢
解决方案
推荐阅读
- python - 将 json 文件格式化为漂亮的阅读
- c# - 如何解决有关 DisallowNull 的 CS8607 警告?
- linux - 如何在 linux 中清空 /dev/sda3
- flutter - 如何使用 SliverList 滚动到索引?
- node.js - 从 slack 中提取内容为 JSON
- c++ - 太多的初始化程序 MQL4
- python - spacy 3 训练自定义 ner 模型
- angular - 访问 mat-checkbox 的“禁用”属性
- google-cloud-platform - gcloud run 是否更改了最小内存限制?
- php - 客户端错误:`POST https://oauth2.googleapis.com/token` 导致 `400 Bad Request` 响应:{ "err": "invalid_grant", "err_description": "Bad Req" }