Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法将TCP响应数据写入变量_Node.js_Sockets_Tcp - Fatal编程技术网

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