Estoy trabajando con net en node.js y estoy enviando un paquete a un servidor y escuchando la respuesta, pero no puedo devolverlo. Aquí está mi código:
function packetsend (sockeT, packeT) { var resp = null; if(sockeT) { sockeT.write(packeT); sockeT.on('data', (data) => { resp = data.toString() }) } return resp; } const socket = new net.Socket(); socket.connect({host: server, port: port}, function() { console.log('Connected'); var packetRecv = packetsend(socket, 'some packet'); if (packetRecv === 'some') { console.log("ok"); } })No entiendo por qué la función de envío de paquetes () no devuelve la variable resp actualizada y, en su lugar, envía un objeto indefinido. Cuando hago console.log(data) dentro de sockeT.on(), veo que recibe datos.
Intente transformar su función de envío de paquetes () en una función asíncrona. Tal vez no devuelva el resp porque lo devuelve antes de que se invoque el evento 'datos'.
Este es solo un ejemplo de una posible implementación:
function packetsend (sockeT, packeT) { return new Promise((resolve, reject) => { if (sockeT) { sockeT.write(packeT); sockeT.on('data', (data) => { resolve(data.toString()); }); //WARNING: I don't know this 'socketT' object, don't know if there is an 'error' event. //but it's recommended to handle errors. This is just an example. sockeT.on('error', (error) => { reject(error); }); } else{ reject('Missing sockeT'); } }); } const socket = new net.Socket(); socket.connect({ host: server, port: port }, function () { console.log('Connected'); packetsend(socket, 'some packet').then(packetRecv => { console.log('Received data => '+ packetRecv); if (packetRecv === 'some') { console.log("ok"); } }).catch(error => console.log(error)); })Actualización: también puede usar async/await
const socket = new net.Socket(); socket.connect({ host: server, port: port }, async function () { try { console.log('Connected'); let packetRecv = await packetsend(socket, 'some packet'); console.log('Received data => '+ packetRecv); if (packetRecv === 'some') { console.log("ok"); } } catch (error) { console.log(error); } });Puntas: