Отправлять предыдущие сообщения в групповой чат

Я работаю в приложении чата. Я хочу хранить сообщения в таком объекте:

{
  'room1': ['msg1', 'msg2', ...]
  'room2': ['msg3', 'msg4', ...]
  ...
}

Я определил переменную на своем сервере socket.io roomMessages проблема в том, что когда я хочу добавить сообщение в определенную комнату, используя roomMessages[room].push(data);, он показывает мне эту ошибку: TypeError: Cannot read properties of undefined (reading 'push') это мой код socket.io:

const roomMessages = {};

roomsNamespace.use((socket, next) => {
  const token = socket.handshake.query.token;
  console.info(token);
  if (!token) return next(new Error("not auth"));
  next();
});

roomsNamespace.on("connection", (socket) => {
  const token = socket.handshake.query.token;
  const apiService = new ApiService(process.env.BE_URL, token);
  const room = socket.handshake.query.room;
  socket.on("join-room", async () => {
    socket.join(room);
    await apiService.joinRoom(room);
    const usersInThisRoom = await apiService.getUsersInRoom(room);
    roomsNamespace.in(room).emit("all-users", usersInThisRoom);
    socket.emit("room-messages", roomMessages[room]);
  });
  socket.on("chat-message", (data) => {
    // console.info(data);
    if (roomMessages[room]) roomMessages[room].push(data);
    roomsNamespace.in(room).emit("chat-message", data);
  });

в основном, я хочу отправлять предыдущие сообщения, когда пользователь присоединяется к чату Как исправить эту ошибку?

Вы пытаетесь вставить данные в объект, вы должны использовать массив. Посмотрите на скобки.

grisuu 06.05.2022 15:10

как это сделать?

Cosmin Ciolacu 06.05.2022 15:12

const roomMessages = [];

grisuu 06.05.2022 15:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы можете сделать что-то вроде этого

const roomMessages = {};

const getMessages = (room) => roomMessages[room] || []
const addMessage = (room, message) => {
  roomMessages[room] = [...getMessages(room), message]
}



roomsNamespace.use((socket, next) => {
  const token = socket.handshake.query.token;
  console.info(token);
  if (!token) return next(new Error("not auth"));
  next();
});

roomsNamespace.on("connection", (socket) => {
  const token = socket.handshake.query.token;
  const apiService = new ApiService(process.env.BE_URL, token);
  const room = socket.handshake.query.room;
  socket.on("join-room", async () => {
    socket.join(room);
    await apiService.joinRoom(room);
    const usersInThisRoom = await apiService.getUsersInRoom(room);
    roomsNamespace.in(room).emit("all-users", usersInThisRoom);
    socket.emit("room-messages", getMessages(room));
  });
  socket.on("chat-message", (data) => {
    // console.info(data);
    addMessage(room, data)
    roomsNamespace.in(room).emit("chat-message", data);
  });


таким образом, если вы хотите позже, вы можете изменить свою реализацию messageRepository хранения данных в Redis или где угодно

Другие вопросы по теме