[英]Cannot access array from child_process in node.js
我想创建一个数组,然后 append 到带有生成的child_process
的data
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.