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



我想创建一个数组,然后用派生的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 = []; 

首先?

如果没有,你会得到提到的错误。

无法读取未定义的属性"push">

因为尚未定义数组。

因此,首先声明数组,然后可以执行类似的操作

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){...});内部,这可能与变量不一致有关,有时在使用之前就会消失。

相关内容

  • 没有找到相关文章

最新更新