繁体   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