Node.js 无法将TCP响应数据写入变量
问题是导出模型的[内部对象的可见性和对函数的异步调用]Node.js 无法将TCP响应数据写入变量,node.js,sockets,tcp,Node.js,Sockets,Tcp,问题是导出模型的[内部对象的可见性和对函数的异步调用] exports.send = function(socket, req, callback) { req.external_response = {}; // initialize empty object client.connect(socket.Port, socket.IPAddress, function() { client.write(req.query);
exports.send = function(socket, req, callback) {
req.external_response = {}; // initialize empty object
client.connect(socket.Port, socket.IPAddress, function() {
client.write(req.query);
});
client.on('data', function(data, req) {
req.external_response = data.toString('utf8');// assign response to it
// console.log(req.external_response); gives out response
});
client.on('close', function() {
client.destroy();
callback();
});
};
在发送完成并执行回调后,我仍然有
req.external_response={}
如果我这样做
var tmp = "";
client.on('data', function(data) {
tmp = data.toString('utf8');// assign response to it
// console.log(tmp); gives out
});
req.external_response = tmp; // tmp 'undefined'
我尝试了各种方法将数据写入变量,但到目前为止没有成功,也许有一些我没有注意到/遗漏的东西。有什么建议吗?如何将TCP响应写入所需变量?第一个代码段可能由于变量冲突而无法工作:
exports.send = function(socket, req, callback) {
req.external_response = {};
client.on('data', function(data, req2) { // <----- req2 !!!
req.external_response = ...
});
client.on('close', function() {
console.log(req.external_response);
client.destroy();
callback();
});
};
无法工作,因为在回调将数据分配给req.external\U response之前,您已将tmp分配给req.external\U response。以下是我试图达到的目标:所有这些都没有结果 1. 2. }) 调用.sendsocket、req、回调
var req = {query:'0000000082&ServiceID=2355&QueryCode=8080'};
sender.send(req, {}, done);
如果您将数据的console.log放在'data'处理程序中只是为了调试,会怎么样?它会输出未来的数据吗?是的。所有问题都在每个客户端内部。在创建的{tmp.data}上,在完成其作业后,数据丢失/擦除客户端。在客户端接受响应后发生“关闭”时,远程服务器在此之后关闭连接。此事件中存在回调,因为“close”位于“data”-Received之后。以前没有,所以在逻辑上更正确的做法是“关闭”而不是“数据”。不管怎样,callback在'data'@EpiGen中也会这样做。我不知道你在说什么。我一句话也没说。在数据事件有机会触发之前,您向我们展示的第二个代码片段清楚地分配给req.external_response,因为它在数据和关闭事件之外。至于第一个片段:这是一个变量冲突。您分配给了另一个对象。@EpiGen,因为您编写了console.logtmp;里面,昂达。当您将req.external_响应分配到其外部时,即更早。我们还在谈论第二个片段吗?因为我不认为这是很难看到的。tmp=data.toString'utf8';在req.external_response=tmp;之后发生@埃皮根很酷。如果您只是将req重命名为req2(如上面的代码所示),那么您应该可以使用第一段代码。如果我将赋值放在.ondata中,结果仍然是一样的。我开始写异步调用。所以,是的,你是对的。但“正确的分配方式”并不能满足需要
var assignData = function(source, destination){
destination = source.toString('utf8');
callback();
};
client.on('data', function(data) {
assignData(data,req.external_response);
});
client.on('data', function(data) {
req.external_response = data.toString('utf8');
callback();
var req = {query:'0000000082&ServiceID=2355&QueryCode=8080'};
sender.send(req, {}, done);