[英]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.