无法从 node.js 中的 child_process 访问数组
Cannot access array from child_process in node.js
我想创建一个数组,然后使用生成的 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 = [];
第一?
否则您将收到上述错误。
Cannot read property 'push' of undefined
因为数组还没有定义
所以先声明数组然后你可以做这样的事情
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){...});
内部,这可能与变量不一致有关,有时会在之前消失他们的用途。
我想创建一个数组,然后使用生成的 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 = [];
第一?
否则您将收到上述错误。
Cannot read property 'push' of undefined
因为数组还没有定义
所以先声明数组然后你可以做这样的事情
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){...});
内部,这可能与变量不一致有关,有时会在之前消失他们的用途。