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

标签 javascript asynchronous callback

我是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
}


哪种方法最适合解决此问题?

最佳答案

data这行以前从未声明过

recvData.push(data);


做一个:

console.log(data);


并且您将看到数据具有undefined值,发生这种情况的原因是,您正在将未定义的值压入要返回的array

关于javascript - 如何使用网络库从函数外部获取更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60972415/

相关文章:

c# - 处理异步和同步代码之间的界限?

javascript - 在没有嵌套函数的情况下跟踪 javascript 回调的完成

ruby-on-rails - ActiveSupport::类方法的回调

javascript - 在 for 循环中设置一个标志,以便在同一循环内调用的函数的回调函数中使用

javascript - 完整日历 GetEvents() 方法调用不起作用

javascript - 判断已经滚动到底部的d​​iv的id

javascript - 如何在循环中运行 fetch()?

javascript - 如何将变量的值传递给 JavaScript 中的不同调用?

javascript - 是否有用于经典 ASP 的 Microsoft Word 组件?

javascript - 将 "quiz"建模为异步 "long running process"