如何将数据从net.Socket.on传递到外部变量或返回它



我在node.js中使用net工作,我正在向服务器发送数据包并听取响应,但我无法返回它。下面是我的代码:

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");
}
})

我不明白为什么packketsend()函数没有返回更新的resp变量,而是发送未定义的对象。当我在sockeT.on()中执行console.log(data)时,我看到它接收数据。

尝试将packketsend()函数转换为异步函数。也许它没有返回resp,因为你在事件'data'被调用之前返回了它。

这只是一个可能实现的例子:

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));
})

更新:你也可以使用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);
}
});

提示:

  • "promise"文档
  • "eventEmitter"文档
  • "async/await"文档

最新更新