Mi proyecto funciona según lo previsto, excepto que tengo que actualizar el navegador cada vez que mi lista de palabras clave envía algo para mostrar. Supongo que es mi inexperiencia con Expressjs y no crear la ruta correctamente dentro de mi websocket. Cualquier ayuda sería apreciada.
Navegador
let socket = new WebSocket("ws://localhost:3000"); socket.addEventListener('open', function (event) { console.log('Connected to WS server') socket.send('Hello Server!'); }); socket.addEventListener('message', function (e) { const keywordsList = JSON.parse(e.data); console.log("Received: '" + e.data + "'"); document.getElementById("keywordsList").innerHTML = e.data; }); socket.onclose = function(code, reason) { console.log(code, reason, 'disconnected'); } socket.onerror = error => { console.error('failed to connect', error); };Servidor
const ws = require('ws'); const express = require('express'); const keywordsList = require('./app'); const app = express(); const port = 3000; const wsServer = new ws.Server({ noServer: true }); wsServer.on('connection', function connection(socket) { socket.send(JSON.stringify(keywordsList)); socket.on('message', message => console.log(message)); }); // `server` is a vanilla Node.js HTTP server, so use // the same ws upgrade process described here: // https://www.npmjs.com/package/ws#multiple-servers-sharing-a-single-https-server const server = app.listen(3000); server.on('upgrade', (request, socket, head) => { wsServer.handleUpgrade(request, socket, head, socket => { wsServer.emit('connection', socket, request); }); });En respuesta a " Cómo enviar y / o transmitir datos de matriz que se actualizan continuamente a un cliente " como se llegó en el comentario.
Una posible solución usando WebSockets puede ser
Cree una interfaz en el servidor para las actualizaciones de la matriz (si aún no lo ha hecho) que aísle el objeto de la matriz de modificaciones externas arbitrarias y admita una devolución de llamada cuando se realicen las actualizaciones.
Determine la latencia permitida para que se produzcan múltiples actualizaciones sin que se envíen. La latencia debe permitir un tiempo razonable para que se complete el tráfico de red anterior sin sobrecargar el ancho de banda innecesariamente.
Cuando se produce una actualización del arreglo, inicie un temporizador si aún no se está ejecutando durante el período de latencia.
Cuando el temporizador expire JSON.stringify la matriz (para tomar una instantánea), borre el estado de ejecución del temporizador y envíe un mensaje al cliente con el texto JSON.
Un método un poco más complicado para evitar el retraso de todas las operaciones de envío sería enviar inmediatamente actualizaciones individuales a menos que ocurran dentro de un período de protección después de la operación de envío más reciente. Entonces, un temporizador podría impulsar las modificaciones realizadas durante el período de protección al final del período de protección.
La API de WebSockets no admite directamente la transmisión de los mismos datos a varios clientes. Consulte Server Broadcast en la documentación de ws para ver un ejemplo de envío de datos a todos los clientes conectados mediante un bucle forEach .
Oyente del lado del cliente
En el detector de mensajes del lado del cliente
document.getElementById("keywordsList").innerHTML = e.data;sería mejor como
document.getElementById("keywordsList").textContent = keywordList;tanto para presentar palabras clave después de decodificarlas de JSON como para evitar que se las trate como HTML.
Así que finalmente descubrí lo que quería lograr. Suena sencillo después de que aprendí lo suficiente y pensé en cómo estructurar el back-end de mi proyecto.
Si tiene dos websockets ejecutándose y uno necesita información del otro, no puede ejecutarlos uno al lado del otro. Debe hacer que uno encapsule al otro y luego llame al websocket DENTRO del otro websocket. Esto puede causar fácilmente problemas en el futuro para otros proyectos, ya que ahora tiene un websocket que no se activará hasta que se ejecute el otro, pero para mi proyecto tiene mucho sentido ya que se ejecuta localmente y necesita que todas las partes funcionen al 100 por ciento en orden. ser efectivo. Me tomó mucho tiempo entender cómo estructurar el código como tal.