• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

286
Vistas
Mi useState en React/NEXTjs no agrega el resultado de un evento socket.io del servidor, solo lo sobrescribe

Marcos utilizados: Next.js, Socket.io, React

Estoy haciendo una aplicación de mensajería simple. Básicamente, solo estoy emitiendo un mensaje que alguien escribe, enviando ese mensaje al servidor, que luego se "transmite" a través de un evento llamado "receive-chat-message". El problema que tengo es que cuando la respuesta se maneja en el front-end con "receive-chat-message", el estado [mensajes] no agrega un nuevo mensaje para mostrar, simplemente sobrescribe el estado.

Mi objetivo es enviar un mensaje al servidor; el servidor luego envía el mensaje al cliente. Luego agrego el nuevo mensaje en el cliente, enviado desde el servidor, al estado de [mensajes] en el cliente, y luego presento el estado de [mensajes]. El problema es que solo sobrescribe el estado de [mensajes] y no le agrega nuevos mensajes.

Código que envía mensaje al servidor

 const [message, setMessage] = useState(""); const handleChange = (e) => { setMessage(e.target.value); }; const submitMessage = async () => { // socket.io const socket = io(); socket.emit("send-chat-message", message, user); setMessage(""); };

Código de front-end

 const [messages, setMessages] = useState([]); useEffect(() => { const socket = io(); socket.on("receive-chat-message", handleSetMessage); return () => socket.disconnect(); }, []); const handleSetMessage = (data) => { /* data prop is the new message - it has a {message: "message", user: "name"} sent from server. THIS IS THE PROBLEM IN THE CODE WHERE IT DOESN'T APPEND NEW MESSAGES TO THE [messages] STATE, IT JUST OVERWRITES THE CURRENT STATE WITH THE NEW MESSAGE. */ setMessages([...messages, data]); };

Código de back-end

 export default async function handler(req, res) { if (!res.socket.server.io) { const io = new Server(res.socket.server); res.socket.server.io = io; io.on("connection", async (socket) => { socket.on("send-chat-message", async (message, user) => { socket.broadcast.emit("recieve-chat-message", { message, name: user && user.name, }); }); }); } }
about 3 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Resolví esto configurando mensajes a través del método funcional como:

 setMessages((messages) => [...messages, data]);

En vez de:

 setMessages([...messages, data])

Creo que necesitamos esto porque estaba actualizando el estado desde una función llamada dentro de un oyente socket.io y en realidad nunca estaba tomando el estado anterior; así que tuve que dirigirlo al estado anterior y luego fusionar los valores.

about 3 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda