我想创建一个数组,然后用派生的child_process
的data
输出追加到该数组,然后在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){...});
内部,这可能与变量不一致有关,有时在使用之前就会消失。