无法从 node.js 中的 child_process 访问数组

Cannot access array from child_process in node.js

我想创建一个数组,然后使用生成的 child_processdata 输出附加到数组,然后在 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 = []; 

第一?

否则您将收到上述错误。

Cannot read property 'push' of undefined

因为数组还没有定义

所以先声明数组然后你可以做这样的事情

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

我找到了答案,虽然我不知道为什么最初的尝试没有奏效。因为我在同一个脚本中多次使用这个模式,所以我决定压缩它以便我可以更轻松地处理它,仅此一项就修复了它。

所以,我所做的是创建一个特殊函数,运行 child_process 并将所有内容合并到一个函数中,如下所示:

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){...});

出于某种原因,它有效。我想出于某种原因,我的变量在被使用之前被某种异步删除函数删除了。注意到所有这些代码(dataCache 变量声明和 const { spawn } = require('child_process'); 除外)都在 socket.on('join',function(data){...}); 内部,这可能与变量不一致有关,有时会在之前消失他们的用途。