我想创建一个数组,然后使用data
生成的输出追加到该数组child_process
,然后在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 = {}
我找到了答案,尽管我不知道为什么最初的尝试不起作用。因为我在同一脚本中多次使用了此模式,所以我决定压缩它,以便可以更轻松地对其进行处理,并且仅靠它进行修复。
因此,我要做的是创建一个运行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){...});
,这可能与变量不一致有关,有时在使用变量之前会消失。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句