如何使用网络库从函数外部获取更新值

Posted

技术标签:

【中文标题】如何使用网络库从函数外部获取更新值【英文标题】:How do I get updated value from outside of function using net library 【发布时间】:2020-07-13 07:02:04 【问题描述】:

我是 JS 新手。 我正在尝试构建 API 服务器,该服务器必须使用套接字从其他服务器接收数据。 目前我正在使用网络库,我遇到了一个问题。 我应该获取数据以检查硬件是否正常工作,但我只得到 undefiend(空数组)。

我发现一些来源使异步函数被调用,但我仍然无法获得它。

这是我的代码。

router.post("/Updated", async function(req, res, next) 
.....
//connect to station server for locking
var data = 
  cmd: "lockStationQuery",
  stationId: STATION_ID,
  powerBankId: POWER_BANK_ID,
  userId: USER_ID,
  number: channelValue
;
var stringData = JSON.stringify(data);
var jsonData = JSON.parse(stringData);

var [client, recvData] = await getConnectionSocket(
  USER_ID,
  res,
  merchant_uid,
  amount
);
let successToWriteData = await writeData(client, stringData);

//Fail to send data to lock the Station
if (!successToWriteData) 
  res.status(500).json(
    RESULT: "FAIL",
    REASON:
      "error code 504"
  );
  res.end();
  return;

console.log("received data", recvData);     //this is empty array
jsonData = JSON.parse(recvData[0]);

这是我的 getConnectionSocket 函数。

async function getConnectionSocket(USER_ID, res, merchant_uid, amount) 
   //서버에 해당 포트로 접속
  var client = "";
  var recvData = [];
  var local_port = "";
  let status = ;
  client = net.connect( port: 8999, host: "localhost" , function() 
    console.log(
  "connect log======================================================================"
);
console.log("connect success");
console.log("local = " + this.localAddress + ":" + this.localPort);
console.log("remote = " + this.remoteAddress + ":" + this.remotePort);

local_port = this.localPort;

this.setEncoding("utf8");
this.setTimeout(300000); // timeout : 10분
console.log("client setting Encoding:binary, timeout:300000");
console.log("client connect localport : " + local_port);
  );

  // 접속 종료 시 처리
  client.on("close", function() 
    console.log("client Socket Closed : " + " localport : " + local_port);
 );

  // 데이터 수신 후 처리
  await client.on("data", function(data) 
    console.log(
  "data recv log======================================================================"
);

recvData.push(data);
console.log(recvData);            //I want this data
console.log("data.length : " + data.length);
console.log("data recv : " + data);
let jsonData = JSON.parse(data);
if (jsonData.cmd === "removedPowerBank") 
  if (jsonData.errorCode !== 0) 
    //환불
    console.log("환불 시작");
    let cancel = cancelOrder(merchant_uid, USER_ID, res);
    //여기서 환불 purchase db에 쓰기
   else 
    console.log("PURCHASE 성공후 디비에 씀");
    //구매 purchase db에 쓰기(getRentId에 썼음)
    let purchased = writePurchaseDataInDB(
      USER_ID,
      res,
      merchant_uid,
      amount
    );
    console.log(purchased);
  


client.end();
  );

  client.on("end", function() 
    console.log("client Socket End");
  );

  client.on("error", function(err) 
    console.log("client Socket Error: " + JSON.stringify(err));
  );

  client.on("timeout", function() 
    console.log("client Socket timeout: ");
  );

   client.on("drain", function() 
    console.log("client Socket drain: ");
   );

   client.on("lookup", function() 
     console.log("client Socket lookup: ");
  );
   return [client, recvData];     //recvData is always empty array

解决这个问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

需要澄清以下几点

你在下面的日志中得到了正确的值吗?或者你也未定义它们。

console.log("data.length : " + data.length);
console.log("data recv : " + data);

也添加这个

console.log("data type : " + typeof(data));

【讨论】:

以上是关于如何使用网络库从函数外部获取更新值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PCL 库从点云数据中获取协方差矩阵?

如何使用 Struts 嵌套标记库从 HashSet 字段属性中获取项目?

如何使用 requests 库从 http 请求中获取 IP 地址?

如何在 Spring Boot 中使用 Java 库从网络中识别或检测扫描仪?

如何在函数外部获取ajax的返回值?

在 postgreSQL 中使用 jpa 存储库从序列中获取下一个值