簡體   English   中英

無法從 node.js 中的 child_process 訪問數組

[英]Cannot access array from child_process in node.js

我想創建一個數組,然后 append 到帶有生成的child_processdata output 的數組,然后在child_process.stdout.on('end',...)回調中使用該數組。

最初我正在嘗試這個:

    const { spawn } = require('child_process');
    var proc = spawn('php',[APIFile, phpParams]);
    var dataRet = [];
    proc.stdout.on('data', (stdout) => {
      dataRet.push(stdout);
    });
    proc.stdout.on('end', (stdout) => {
      ...
      // Do something with dataRet
      ...
    });

這導致了錯誤, Cannot read property 'push' of undefined

因此,我決定創建一個全局變量以確保該變量可以訪問。 所以,我這樣做了:

    const { spawn } = require('child_process');
    var proc = spawn('php',[APIFile, phpParams]);
    dataCache[proc] = [];
    proc.stdout.on('data', (stdout) => {
      dataCache[proc].push(stdout);
    });
    proc.stdout.on('end', (stdout) => {
      ...
      // Do something with dataCache[proc]
      ...
    });

起初它似乎在工作,然后我發現它有時會崩潰,就像以前一樣, Cannot read property 'push' of undefined

更多信息

所以我今天回到了它,現在它因另一個錯誤而崩潰。

    const { spawn } = require('child_process');
    var proc = spawn('php',[APIFile, phpParams]);
    dataCache[proc] = [];
    proc.stdout.on('data', (stdout) => {
      dataCache[proc].push(stdout);
    });
    proc.stdout.on('end', (stdout) => {
      ...
      var dataOut = dataCache[proc].join('');// It's crashing here
      ...
    });

正如所評論的那樣,它在var dataOut = dataCache[proc].join('');上崩潰了 . 沒有代碼改變。 錯誤非常相似, Cannot read property 'join' of undefined

也有一段時間它根本沒有崩潰。 所以它肯定是非常不一致的。

另外,我確實在腳本的早期定義dataCache ,在全局命名空間中,使用了一個簡單的聲明, dataCache = {}

你在聲明

let dataCache = []; 

第一的?

如果沒有,您將收到上述錯誤。

無法讀取未定義的屬性“推送”

因為數組還沒有定義。

所以先聲明數組然后你可以做這樣的事情

 let dataCache = []; const obj = { ["owl"]: "Are nice creatures" } dataCache.push(obj) console.log(dataCache)

對於您的情況,它看起來像這樣..

let dataCache = [];
proc.stdout.on("data", (stdout) => {
  const obj = {
    [proc]: stdout,
  };
  dataCache.push(obj);
});

我找到了答案,雖然我不知道為什么最初的嘗試沒有奏效。 因為我在同一個腳本中多次使用這種模式,所以我決定壓縮它,以便更輕松地處理它,僅此一項就修復了它。

所以,我所做的是創建一個特殊的 function 運行 child_process 並將所有內容合並到一個 function 中,如下所示:

function runPHPProcess(APIFile,phpParams,callbackFinished,callbackError,callbackClose){
  var proc = spawn('php',[APIFile, phpParams]);
  var retData = [];
  proc.stdout.on('data', (stdout) => {
    retData.push(stdout);
  });
  proc.stdout.on('end', () => {
    var stdout = retData.join('');
    callbackFinished(stdout);
  });
  proc.stderr.on('data', (data) => {
    if(typeof callbackError != "undefined")
      callbackError(data);
    console.error("there was an error: "+data.toString('utf8'));
  });
  proc.on('close', (code) => {
    if(typeof callbackClose != "undefined")
      callbackClose(data);
    console.log(`child process exited with code ${code}`);
  });
}

然后我替換了我之前的代碼,即

    var proc = spawn('php',[APIFile, phpParams]);
    dataCache[proc] = [];
    proc.stdout.on('data', (stdout) => {
      dataCache[proc].push(stdout);
    });
    proc.stdout.on('end', (stdout) => {
      ...
      var dataOut = dataCache[proc].join('');// It's crashing here
      ...
    });

和:

runPHPProcess(APIFile,phpParams,function(stdout){...});

出於某種原因,它有效。 我猜出於某種原因,我的變量在使用之前就被刪除了,通過某種異步刪除 function。 注意到所有代碼(除了dataCache變量聲明和const { spawn } = require('child_process'); )都在socket.on('join',function(data){...}); ,這可能與變量不一致有時在使用前消失有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM